Was ist die Token-ID von `]`?

9

Bash Manual sagt:

Wenn das [Formular verwendet wird, muss das letzte Argument für den Befehl a] sein.

$ type [
[ is a shell builtin
$ type ]
bash: type: ]: not found

Es ]ist also weder ein reserviertes Wort noch ein Operator oder ein eingebauter Befehl.

Was ist als Token die Token-ID von ]? WORT oder NAME?

Tim
quelle
4
Eigentlich [ist (auch) ein autarker Befehl: -rwxr-xr-x 1 root root 39552 3. Dezember 18:14 / usr / bin / [Obwohl es möglich ist, dass auch "parallel" eingebaut ist, wie es für ist zum Beispiel kill. Auf einigen Systemen ist der testBefehl eine symbolische Verknüpfung zu [oder umgekehrt. AFAIK ]bedeutet nichts für sich, wird aber akzeptiert, um ein "zu schließen" [- aber es ist eher aus "ästhetischen" Gründen.
Baard Kopperud
5
Die Shell-Sprache ist in den letzten 46 Jahren Schicht für Schicht gewachsen, und die interne Konsistenz hatte nie Priorität. Wenn Sie versuchen, es in irgendeinen theoretischen formalen Sprachrahmen zu integrieren, werden Sie eine schlechte Zeit haben.
zwol
Da [es sich (auch) um einen in sich geschlossenen Befehl handelt, hat er normalerweise eine Manpage ... Versuchen Sie es also man [mit / und man test( [und es testkann sich um denselben Befehl handeln).
Baard Kopperud
Versuchen Sie, das ]in einfache oder doppelte Anführungszeichen zu setzen, und Sie werden sehen, dass es keinen Unterschied macht. Es ist nur eine Schnur.
Wildcard

Antworten:

21

]Ergänzungen [ist es das abschließende Zeichen des [Befehls.

Wie die manSeite hervorhebt, ist dies eigentlich ein Argument dafür [, [behandelt es aber besonders als Ende.

Sie können es mit einigen anderen Befehlsschließmustern vergleichen, z. B. ;in find .. exec.

heemayl
quelle
Vielen Dank. Was ist der Token-Typ / Bezeichner von ]?
Tim
8
@Tim ]unterscheidet sich in diesem Zusammenhang nicht von anderen normalen Zeichen (als Argument für einen Befehl). Der testBefehl behandelt es speziell, aber das liegt am Befehl.
Muru
6
Es ist nur eine Zeichenfolge und [löst einen Fehler aus, wenn das endgültige Argument nicht genau gleich ist ].
Chepner
19

Bash behandelt die [oder ]Zeichen (allein) nicht anders als einen Buchstaben des Alphabets.

In diesem Fall sieht bash ein "Wort" [und sucht nach einem Befehl mit diesem Namen. Wenn Sie in Ihr Dateisystem schauen, werden Sie wahrscheinlich feststellen, dass /bin/[(oder /usr/bin/[) als ausführbare Datei existiert. Bash bietet zwar auch eine integrierte Version (aus Gründen der Effizienz), dies ist jedoch nur ein Implementierungsdetail.

Der [Befehl (wie in der ausführbaren Datei mit diesem Namen) hat die Regel, dass der letzte Parameter, den Sie an ihn übergeben, sein sollte, ]sonst wird ein Fehler ausgegeben. Dies mag teilweise daran liegen, dass es ästhetisch ansprechend ist, aber es dient auch dazu, Sie vor versehentlich abgeschnittenen Befehlen zu schützen, was sehr schön ist.

Die Tatsache, dass dies nichts Besonderes ist, ist der Grund, warum Sie den Leerraum vor und nach dem [oder nicht weglassen können ].


Ausnahmen :

  • Wenn [und ]im richtigen Format innerhalb desselben Wortes auftreten, z. B. [a-z]dann ist das etwas Besonderes und es gelten die Globbing-Regeln von Bash.
  • Der [[Befehl ist etwas Besonderes und kann viele Dinge [nicht (und die darin enthaltenen Parameter [[ .. ]]werden ebenso wie einige Zeilenumbrüche unterschiedlich verarbeitet). Das Entsprechende ]]ist ebenfalls speziell, da es sich um ein Shell-reserviertes Wort handelt, das kein Befehlsname sein kann, und die spezielle Verarbeitung beendet, die auf das [[Schlüsselwort folgt .
ams
quelle
1
@JacobKrall Es ist kein Sonderzeichen wie ;oder >, es ist nur ein eingebauter Befehl wie cd. Insbesondere wenn Sie tippen [x, [hat das keine besondere Bedeutung.
Barmar
2
@JacobKrall Das gilt für alle eingebauten Befehle. [ist ein spezieller Befehl , es ist kein besonderes Zeichen .
Barmar
@Barmar: Fair genug; Ich ziehe meine Kommentare zurück.
Jacob Krall
Eigentlich ]]ist es etwas Besonderes als ]. Bei der Verwendung [und ]sie sind nur Wörter. Wenn Sie es weggelassen ]oder durch ein anderes Wort ersetzt haben, wird bash weiterhin ausgeführt [, es [wird jedoch ein Fehler ausgegeben. Jedoch [[und ]]behandelt besondere beim Parsen. Wenn Sie durch ]]etwas anderes ersetzt haben, meldet bash einen Syntaxfehler. Und wenn Sie ]]bash weglassen würden, würden Sie die nächste Zeile weiter analysieren und nach dem suchen ]].
Kasperd
@kasperd Antwort angepasst.
ams
3

Einfacher ausgedrückt als die beiden vorherigen Antworten ]ist nur eine Zeichenfolge, [die ausgeführt werden muss.

Kenny
quelle
1
Dies scheint ein bisschen wie ein Kommentar ...
wizzwizz4
@ wizzwizz4, angesichts der Anschlussfragen des OP in Kommentaren denke ich, dass diese Einfachheit genau das ist, was er brauchte.
Wildcard
@ Wildcard Ich stimme tatsächlich zu. Es gab etwas, das mich dazu verleitete, diese Antwort zu verbessern, aber ich fand sie von geringer Qualität. (Ich habe jedoch nicht abgestimmt!) Ich werde bearbeiten, um das Markup zu verbessern.
wizzwizz4