Leerzeichen neben Rohren

17

Ich habe gesehen history | grep blahund history |grep blah; und history|grep blahfunktioniert auch, obwohl niemand es jemals zu benutzen scheint.

Gibt es eine Bedeutung in den Leerzeichen (z. B. erfordert das Weiterleiten von / zu verschiedenen Befehlen eine unterschiedliche Verwendung von Leerzeichen), oder ist dies immer willkürlich?

EmmaV
quelle
13
Meistens Lesbarkeit.
Jasonwryan
1
|Pipe oder ;Semikolon werden von den meisten Shell (bash, ksh, tcsh) als Trennzeichen für Befehle verwendet. wenn nicht in Anführungszeichen eingeschlossen, sind Leerzeichen vor und nach irrevelent.
Archemar

Antworten:

24

bashdefiniert mehrere Metazeichen . Von man bash:

Metazeichen
Ein Zeichen, das, wenn es nicht in Anführungszeichen gesetzt wird, Wörter voneinander trennt. Eine der folgenden
Möglichkeiten : &; () <> Leertaste

Da Metazeichen Wörter trennen, spielt es keine Rolle, ob sie von Leerzeichen umgeben sind. Das Pipe-Symbol |ist ein Metazeichen und benötigt daher, wie Sie bemerkt haben, keine Leerzeichen.

Beachten Sie, dass [, ], {, }, und =sind nicht Metazeichen. Ihre Bedeutung hängt dagegen stark davon ab, ob sie von Leerzeichen umgeben sind.

Beispiele, wann Leerzeichen benötigt werden und wann nicht

Wie Sie bemerkt haben, spielt es keine Rolle, ob |es von Leerzeichen umgeben ist. Betrachten wir einige Beispiele, die Bash-Benutzer häufig verwirren. Erwägen:

$ (date)
Sun Mar  1 12:47:07 PST 2015

Die obigen Parens erzwingen, dass der dateBefehl in einer Subshell ausgeführt wird. Da (und )Metazeichen sind, werden keine Leerzeichen benötigt. Im Gegensatz:

$ {date}
bash: {date}: command not found

Da {und }sind nicht Metazeichen, die Shell behandelt {date}als ein Wort. Anstatt nach dem dateBefehl zu suchen , wird nach einem Befehl mit dem Namen gesucht {date}. Da es keinen findet, kommt es zu einem Fehler.

Ein weiteres häufiges Problem ist der testBefehl. Folgendes funktioniert erfolgreich:

$ [ abc ] && echo Yes
Yes

Entfernen Sie die Leerzeichen und ein Fehler tritt auf:

$ [abc] && echo Yes
bash: [abc]: command not found

Da [und ]sind nicht Metazeichen, die Shell behandelt [.bashrc]als ein einzelnes Wort , und das Ergebnis, wie in dem dateBeispiel ist ein Fehler.

Zuweisungsanweisungen reagieren auch empfindlich auf Leerzeichen. Die folgende Zuordnung ist erfolgreich:

$ v=date
$ echo $v
date

Fügen Sie ein Leerzeichen hinzu und die Zuweisung schlägt fehl:

$ v= date
Sun Mar  1 12:55:05 PST 2015

Oben wird die Shell vorübergehend vauf leer gesetzt und führt dann den dateBefehl aus.

Das Hinzufügen eines Leerzeichens vor =verursacht ebenfalls einen Fehler, jedoch aus einem anderen Grund:

$ v =date
bash: v: command not found

Hier versucht die Shell, den Befehl vmit dem Argument auszuführen =date. Der Fehler liegt daran, dass kein benannter Befehl gefunden wurde v.

John1024
quelle
1
Ich bin kürzlich Opfer der Einsatzerklärung geworden. Ich hatte Leerzeichen vor und nach dem =. Das Debuggen hat eine Weile gedauert.
Topher
3

Mit Pipes können Sie die Ausgabe eines Programms als Eingabe eines anderen Programms verwenden ...

In Bezug auf Leerzeichen ist es nur eine Frage der Lesbarkeit / Personalpräferenz, wie @ jasonwryan erwähnt.

Eine Leertaste vor und nach "|" ist die Norm ....

Sie können es auch mit Spalte -t ​​verwenden, um nicht nur Ihren einen Liner sauber zu machen, sondern auch Ihre Ausgabe.

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
quelle
2

Es gibt einen Fall, in dem es nützlich sein kann, keine Leerzeichen zu verwenden. Wenn Sie kein US-amerikanisches Layout verwenden, müssen Sie möglicherweise einige Kombinationen verwenden, AltShiftLum eine Pipe einzugeben. Dies ist zwar per se kein Problem, aber eine Konsequenz ist, dass Sie manchmal auch nicht druckbare Zeichen vor oder nach diesem Zeichen eingeben. Zum Beispiel auf einer französisch Macbook Pro Tastatur, habe ich zu verwenden AltShiftLzur Eingabe |. Wenn Sie schnell tippen, können Sie versehentlich Folgendes eingeben: 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

Wenn Sie nicht wissen, dass Sie AltShiftSpaceein anderes Leerzeichen eingeben (das nicht unterbrechende Leerzeichen ( U + 00A0 )), ist der folgende Fehler möglicherweise schwer zu verstehen:zsh: command not found:  tail

Alecail
quelle
1

Die einzige Bedeutung von Räumen ist in diesem Fall die Ästhetik.
Oder mit anderen Worten nützlich, um die Befehle für einen Menschen lesbarer zu machen.

asoundmove
quelle