bash
definiert 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 date
Befehl 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 date
Befehl 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 test
Befehl. 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 date
Beispiel 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 v
auf leer gesetzt und führt dann den date
Befehl 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 v
mit dem Argument auszuführen =date
. Der Fehler liegt daran, dass kein benannter Befehl gefunden wurde v
.