bashdefiniuje 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ą datepolecenie 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 testpolecenie. 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ę vna pustą, a następnie wykonuje datepolecenie.
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 vz argumentem =date. Błąd wynika z tego, że nie znaleziono żadnej nazwy polecenia v.