Was bedeuten "[EXPRESSION], [] und [OPTION" im "Man Test"?

8

Bei der Prüfung man testsehe ich, dass unter Synopse für testdie Möglichkeiten test EXPRESSIONund test.

Was [ EXPRESSION ], [ ] and [OPTIONbedeutet unten?

Warum sind die Klammern leer und warum [OPTIONfehlt eine Klammer? Kann das jemand für mich interpretieren?

NAME
       test - check file types and compare values

SYNOPSIS
       test EXPRESSION
       test

       [ EXPRESSION ]
       [ ]
       [ OPTION
Shuzheng
quelle

Antworten:

10

[ist ein anderer Name für test. Alle drei Zeilen sind Befehlszeilen, die testmit einigen Optionen ausgeführt werden.

In der ersten Zeile handelt es sich um Standardtests: [ 5 -gt 4 ]ist dasselbe wie test 5 -gt 4.

Im zweiten Fall wird der Ausdruck weggelassen, was bedeutet, dass false ( 0 arguments: Exit false (1)) beendet wird.

Für den dritten Fall verwenden Sie vermutlich GNU-Coreutils. In GNU testenthält der Hilfetext diesen Hinweis:

NOTE: [ honors the --help and --version options, but test does not.
test treats each of those as it treats any other nonempty STRING.

Dies ist eine Nicht-POSIX-Erweiterung . Die Motivation scheint zu sein, dass testes erforderlich ist, diese Argumente wie alle anderen als Zeichenfolgen zu behandeln. [ist in der Lage, den Optionsfall vom String-Fall durch das Vorhandensein der schließenden ]Klammer zu unterscheiden.

Beachten Sie, dass Ihre Shell wahrscheinlich eine eigene bereitstellt [, sodass Sie /bin/\[diese Version verwenden müssen.

Michael Homer
quelle
4

[ist das gleiche wie testeine Shell, die auf einigen Shells eingebaut ist.

Wenn Sie weiter nach unten schauen man test, wird beschrieben, mit welchen Gültigkeiten EXPRESSIONSie testen können:

Eine ausgelassene EXPRESSION ist standardmäßig false. Andernfalls ist EXPRESSION wahr oder falsch und setzt den Exit-Status. Es ist eins von: ...

Dies kann für Sie nicht von der Mann-Seite, aber bei älteren / einigen anderen Schalen offensichtlich sein, die beide [und testsind als tatsächliche Befehle zur Verfügung, was bedeutet , dass der Raum , den Sie in sehen [ EXPRESSION ]ist obligatorisch für EXPRESSIONals akzeptiert werden Argument für [/ test. Selbst für Shells, die sie als integrierte Funktionen anbieten, wird dieses Format aus Kompatibilitätsgründen beibehalten.

Und wie in der Antwort von @ dr01 erklärt , während ich dies schreibe, ist die rechte eckige Klammer optional.

hjk
quelle
@don_crissti danke für das Heads-up, ich denke, ich werde einfach den letzten Satz weglassen ...
hjk
0

[ OPTION fehlt nicht wirklich eine Klammer.

In der Tat ist es vielleicht überraschend, dass [ein Befehl (in /usr/bin/[) äquivalent zu ist test. Daher war es (zumindest theoretisch) erlaubt, nur die linke Klammer zu verwenden, wobei die rechte Klammer nur als syntaktischer Zucker diente. Allerdings erfordert es neuere Versionen Shell .

DR_
quelle
Gibt es andere Unterschiede zwischen diesen, testdie nicht mit einer Option verwendet werden können (nicht mit dieser Möglichkeit aufgeführt).
Shuzheng
1
Es ist nicht wegzulassen die rechte Klammer, entweder in POSIX oder GNU erlaubt [.
Michael Homer
@ MichaelHomer Ja. Korrigiert.
dr_
Ich bin nicht sicher, was Bash damit zu tun hat ...
Michael Homer
1
@MichaelHomer, in POSIX ist das Verhalten, wenn Sie die rechte Klammer weglassen, nicht angegeben, sodass ein POSIX- Skript das nicht weglassen darf ], aber ein POSIX [kann tun, was es will, einschließlich des Aufrufs Ihrer Namen und des Neustarts des Computers oder des Druckens einer Hilfemeldung wenn du es ohne nennst. Das erlaubt GNU grep‚s [ --version. test --versionund müssen [ --version ]jedoch true zurückgeben (Test für --versiondie nicht leere Zeichenfolge) und nichts ausgeben.
Stéphane Chazelas