Miejsca obok rur

17

Widziałem history | grep blahi history |grep blah; a history|grep blahtakże działa, chociaż wydaje się, że nikt go nigdy nie używa.

Czy jest jakieś znaczenie w przestrzeniach (np. Potokowanie do / z różnych poleceń wymaga innego użycia spacji), czy zawsze jest arbitralne?

EmmaV
źródło
13
Głównie czytelność.
jasonwryan
1
|potok lub ;średnik są używane przez większość powłok (bash, ksh, tcsh) jako separator poleceń. gdy nie są ujęte w cudzysłów, białe znaki przed i po są nieistotne.
Archemar

Odpowiedzi:

24

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.

John1024
źródło
1
Niedawno padłem ofiarą oświadczenia o przydziale. Miałem spacje przed i po =. Trochę czasu zajęło debugowanie.
topher
3

Rury umożliwiają wykorzystanie danych wyjściowych programu jako danych wejściowych innego ...

Jeśli chodzi o przestrzeń, to tylko kwestia czytelności / preferencji personalnych, takich jak wspomniany @jasonwryan.

Jeden spacja przed i po „|” jest normą ....

Możesz także użyć go z kolumną -t, aby nie tylko zadbać o czystość jednego linijki, ale także o wynik.

lnydex99uhc:depot_r user$ lsof | grep my | column -t
Microsoft  290  user  txt  REG  1,4  9515016  170972    /Library/Fonts/PCmyoungjo.ttf
bash       359  user  cwd  DIR  1,4  714      12246074  /Users/zatef/hw2/base/active/myapp
Zee
źródło
2

Jest jeden przypadek, w którym użyteczne może być nie używanie spacji. Jeśli nie używasz układu amerykańsko-amerykańskiego, możesz zostać zmuszony do użycia niektórych kombinacji, takich jak AltShiftLwprowadzenie potoku. Chociaż nie jest to problem sam w sobie, jedną konsekwencją jest to, że czasami wprowadzasz znaki niedrukowalne przed lub po tym znaku. Na przykład na francuskiej klawiaturze Macbooka Pro muszę użyć AltShiftLdanych wejściowych |. Gdy piszesz szybko, możesz przypadkowo wpisać to: AltShift( L, Space)

$ sudo dmesg | tail
zsh: command not found:  tail

echo "sudo dmesg | tail" | od -a
0000000    s   u   d   o  sp   d   m   e   s   g  sp   |         t   a
0000020    i   l  nl

Jeśli nie wiesz, że AltShiftSpacewprowadza inną spację (spację nierozdzielającą ( U + 00A0 )), następujący błąd może być trudny do zrozumienia:zsh: command not found:  tail

alecail
źródło
1

Jedynym znaczeniem przestrzeni w tym przypadku jest estetyka.
Lub innymi słowy przydatne, aby polecenia były bardziej czytelne dla człowieka.

asoundmove
źródło