builtin [, -bash: [: fehlt `] '

7

während er auf die harte Tour lernen bash durch, fand ich , dass [und testsind beide Befehle und Synonyme, und beide sind builtin.
Da es sich um ein eingebautes Gerät handelt, sollte es keinen Fehler geben builtin [, aber ich -bash: [: missing `]'bekomme, kann mir jemand das Verhalten des eingebauten hier erklären. Danke im Voraus.

anupam:Markdown$ which [
/usr/bin/[
anupam:Markdown$ echo $?
0
anupam:Markdown$ which test
/usr/bin/test
anupam:Markdown$ echo $?
0
anupam:Markdown$ builtin test
anupam:Markdown$ echo $?
1
anupam:Markdown$ builtin [
-bash: [: missing `]'
anupam:Markdown$ echo $?
2
anupam:Markdown$ 
Lazarus
quelle

Antworten:

10

Die [Version des Befehls erfordert ]als obligatorischen letzten Parameter (daher muss ein Leerzeichen vorangestellt werden ). Es ist nur eine formale, syntaktische Sache, Benutzer zu zwingen, den in Klammern gesetzten „Block“ zu schließen. Befehle sehen also folgendermaßen aus:

if [ $1 -eq 2 ]; then

anstatt

if [ $1 -eq 2; then

Siehe help [:

$ help [
[: [ arg... ]
    Evaluate conditional expression.

    This is a synonym for the "test" builtin, but the last argument must
    be a literal `]', to match the opening `['.

Anmerkungen

  • Die testVersion erfordert oder akzeptiert das Finale nicht ].

  • Das brauchst du da nicht builtin. Builtins haben Vorrang vor externen Befehlen, würden also nur [das Builtin ausführen. Der builtinBefehl ist nützlicher, wenn Sie eine Funktions- oder Alias-Maskierung haben [.

Melebius
quelle
2
@jazzz du brauchst das builtinda nicht. Builtins haben Vorrang vor externen Befehlen, würden also nur [das Builtin ausführen. Der builtinBefehl ist nützlicher, wenn Sie eine Funktions- oder Alias-Maskierung haben [.
Muru
1
@muru Vielen Dank für Ihre Bearbeitung und Kommentar. Ich war mir des helpBefehls nicht wirklich bewusst (nicht verfügbar in Zsh, das ich meistens benutze). Ich habe gerade meine Antwort in Wiki geändert. Sie können Ihre Notiz auch direkt in die Antwort aufnehmen.
Melebius
2
@Melebius: O das musstest du nicht machen! Die Antwort war an sich in Ordnung, die Bearbeitung war nur eine Zusatzinformation (und ich konnte sowieso ohne CW bearbeiten: P). Auch zsh Benutzer selbst, so habe ich eine Funktion nur für die Zeiten hinzugefügt, die ich zitieren muss help:bh () (bash -c 'for i; do help "$i"; done' bash "$@")
Muru
1
Für mich test a = a ]beschwert sich über zu viele Argumente. Was lässt Sie denken, testsollte ein akzeptieren ]?
Hmakholm verließ Monica
1
@Melebius: Das ist kein leerer Ausdruck; das ist ein "ist ]eine nicht leere Zeichenfolge?" Abfrage.
Hmakholm verließ Monica