bash
definiuje kilka metaznaków . Od man bash
:
metaznak
Znak, który, gdy nie jest cytowany, oddziela słowa. Jedną z następujących czynności:
| I; () <> spacja
Ponieważ metaznaki oddzielają słowa, nie ma znaczenia, czy są one otoczone spacjami. Symbol potoku |
, jest metaznakiem, a zatem, jak zauważyłeś, nie potrzebuje wokół niego spacji.
Należy zauważyć, że [
, ]
, {
, }
, i =
to nie metaznaki. Natomiast ich znaczenie zależy silnie od tego, czy są otoczone pustkami.
Przykłady sytuacji, gdy spacje są i nie są potrzebne
Jak zauważyłeś, nie ma znaczenia, czy |
jest otoczony przestrzenią. Rozważmy kilka przykładów, które często dezorientują użytkowników bash. Rozważać:
$ (date)
Sun Mar 1 12:47:07 PST 2015
Pareny powyżej zmuszają date
polecenie do uruchomienia w podpowłoce. Ponieważ (
i )
są metaznakami, nie są potrzebne żadne spacje. Dla kontrastu:
$ {date}
bash: {date}: command not found
Ponieważ {
i nie}
są metaznakami, powłoka jest traktowana jako jedno słowo. Zamiast szukać polecenia, szuka polecenia o nazwie . Ponieważ nie można go znaleźć, pojawia się błąd.{date}
date
{date}
Innym częstym problemem jest test
polecenie. Następujące działa pomyślnie:
$ [ abc ] && echo Yes
Yes
Usuń spacje i pojawi się błąd:
$ [abc] && echo Yes
bash: [abc]: command not found
Ponieważ [
i nie]
są metaznakami, powłoka traktuje jako pojedyncze słowo, a wynik, podobnie jak w przykładzie, jest błędem.[.bashrc]
date
Instrukcje przypisania są również wrażliwe na spacje. Następujące zadanie powiedzie się:
$ v=date
$ echo $v
date
Dodaj spację, a przypisanie nie powiedzie się:
$ v= date
Sun Mar 1 12:55:05 PST 2015
W powyższym powłoka tymczasowo ustawia się v
na pustą, a następnie wykonuje date
polecenie.
Dodaj spację wcześniej =
również powoduje awarię, ale z innego powodu:
$ v =date
bash: v: command not found
Tutaj powłoka próbuje wykonać polecenie v
z argumentem =date
. Błąd wynika z tego, że nie znaleziono żadnej nazwy polecenia v
.