Ich bin immer wieder überrascht, dass sich in dem Ordner /bin
ein [
Programm befindet.
Heißt das, wenn wir etwas machen wie if [ something ]
:?
Wenn Sie das [
Programm explizit in einer Shell aufrufen, werden Sie nach einer Entsprechung gefragt. ]
Wenn Sie die schließende Klammer angeben, scheint es nichts zu tun, unabhängig davon, was zwischen den Klammern steht.
Es erübrigt sich zu erwähnen, dass der übliche Weg, Hilfe zu einem Programm zu erhalten, nicht funktioniert, dh weder funktioniert man [
noch [ --help
.
[
bezieht sich auftest
Befehl, aber nichtexpr
, so sollte es seinman test
man '['
funktioniert gut für mich - entweder hast du vergessen zu zitieren[
oder du hast eine andere Definition von "funktioniert".[
Wertet die Argumente aus, sodass Sie zwischen allen Leerzeichen einfügen müssen.[ a=b ]
ist kein Vergleich: es ist immer wahr (es ist eine einzelne Zeichenfolge: "a = b", die immer als wahr ausgewertet wird ) und Sie sollten die Anzahl der Argumente auf 4 begrenzen (auch wenn die jüngsten Implementierungen mehr zulassen. Die Beschränkung auf 4 macht es portabler. Beispiel:[ "a" = "b" ]
Hat bereits 4 Argumente: "a" = "b" und das nicht notwendige Ende des Tests arg: "]"). Wenn Sie mehr brauchen: Kettentests mit zum Beispiel:if [ "$Var_a" = "foo" ] && [ "$Var_b" = "bar" ] ; then : do something ; fi
!
für sich (ohne Flucht und ohne Anführungszeichen) wird nicht ersetzt und wäre noch besserif ! [ ...
. Alle Bash-Erweiterungen, die verwendet werden,!
beinhalten mindestens die Erweiterung für andere Charaktere[
-builtin gibtbash
(und möglicherweise auch andere Shells), und dass dies anstelle von verwendet werden kann/bin/[
. Es gibt auch dentest
Befehl -command, der auf vielen Systemen eine symbolische Verknüpfung zu/bin/[
(oder umgekehrt) darstellt, auf anderen jedoch einen separaten Befehl.Antworten:
Der
[
Befehl hat die Aufgabe, Testausdrücke auszuwerten. Es wird mit dem Exit-Status 0 (das heißt true ) zurückgegeben, wenn der Ausdruck in true aufgelöst wird, und mit etwas anderem (was false bedeutet ).Es ist nicht so, dass es nichts tut, es ist nur so, dass das Ergebnis in seinem Ausgangsstatus zu finden ist. In einer Shell können Sie den Exit-Status des letzten Befehls in
$?
für Bourne-ähnliche Shells oder$status
in den meisten anderen Shells (fish / rc / es / csh / tcsh ...) abrufen.In anderen Sprachen wie
perl
z. B. wird der Exit-Status beispielsweise im Rückgabewert von zurückgegebensystem()
:Beachten Sie, dass alle modernen Bourne-ähnlichen Shells (und
fish
) einen eingebauten[
Befehl haben. Das one in wird/bin
normalerweise nur ausgeführt, wenn Sie eine andere Shell verwenden oder wenn Sie Dinge wieenv [ foo = bar ]
oderfind . -exec [ -f {} ] \; -print
oder denperl
obigen Befehl ausführen ...Der
[
Befehl ist auch unter demtest
Namen bekannt. Beim Aufruf alstest
ist kein abschließendes]
Argument erforderlich .Während Ihr System möglicherweise keine Manpage für hat
[
, hat es wahrscheinlich eine fürtest
. Beachten Sie jedoch erneut, dass dies die/bin/[
oder/bin/test
-Implementierung dokumentieren würde . Um mehr über die[
in Ihrer Shell integrierten Funktionen zu erfahren , sollten Sie stattdessen die Dokumentation zu Ihrer Shell lesen.Weitere Informationen zum Verlauf dieses Dienstprogramms und zum Unterschied zum
[[...]]
Ausdruck "ksh test" finden Sie in den folgenden Fragen und Antworten .quelle
[
. Ich erinnere mich nicht, ob es eine Bourne-Variante oder eine antike Version von Esche war.[
als auchtest
als integrierte Komponente in Unix System III implementiert . Davor gab es keinen[
und estest
gab nur einen externen Binärbefehl.find . -exec [ f {} ] \; -print
? Der Befehlfind . -type f -print
würde dasselbe so viel effizienter machen ...Sie haben Recht, überrascht zu sein. Dies ist einer der seltenen POSIX-Befehle mit dem Dienstprogramm null (
:
), der die Konvention zulässiger Zeichen für die Befehlsdatei (portabler Zeichensatz für Dateinamen) nicht einhält.Genau, aber es kann auch ohne verwendet werden
if
.Es macht nichts sichtbares, aber es macht tatsächlich das Gleiche wie bei Verwendung mit
if
, dh es setzt den Exit-Status auf 0 (wahr) oder irgendetwas anderes (falsch), je nachdem, was Sie in die Klammern setzen. Es ist (aus einem Grund) dasselbe Verhalten wie dertest
Befehl; Der einzige Unterschied ist, dass es nach dem Ende sucht]
. Sieheman test
für weitere Einzelheiten.Das hängt von Ihrem Betriebssystem ab.
man [
Funktioniert auf jeden Fall für ein paar gängige Gnu / Linux-Distributionen, aber nicht für Solaris.[ --help
funktioniert je nach Implementierung möglicherweise oder auch nicht, da die Syntax sowieso durchbrochen wird und die Endung fehlt]
. Darüber hinaus ist der POSIX - Standard für dietest
/[
Befehlsregeln ausdrücklich alle Optionen, einschließlich der--
Option Beendigung so beide[ --help ]
undtest --help
Notwendigkeit zurückzukehrentrue
und nach Design schweigen. Beachten Sie, dass das, was Sie in oder nach eckigen Klammern setzen[
und wie Optionen (z. B. und dergleichen) aussehen-f file
,-n string
keine Optionen, sondern Operanden sind .Alle modernen Bourne Stil Shell Interpreter (wie
bash
,ksh
,dash
undzsh
ein paar zu nennen) die Umsetzungtest
/[
intern als builtin Dienstprogramm so , wenn Sie sie verwenden, das richtige Handbuch Seite verweisen könnte derjenige der Schale sein, nicht dastest
eine.Vor Unix System III (1981) implementierte die Bourne-Shell das
test
Dienstprogramm nicht als eingebautes Dienstprogramm, sodass nur die Implementierung externer Binärbefehle verfügbar war.[
Bis Unix System III gab es weder einen Befehl (intern noch eingebaut), so dass Sie beispielsweise unter Unix Version 7 Folgendes eingeben mussten:Anstatt von:
quelle
man test
funktioniert aber nichtman [
Andererseits weiß meine Cygwin-Umgebung davonman [
!man [
scheint auf Manjaro (Arch Linux basiert) nicht zu funktionieren. Das Handbuch fürtest
Listen[ --help
als gültiger Aufruf, der Hilfe zeigen sollte, aber interessanterweise nicht, und sich stattdessen über ein Fehlen beschwert]
, genauso wie bei--version
. Das Hinzufügen von]
hat keine Auswirkung, daher scheint es unmöglich zu sein, Hilfe zu erhalten, außer vonman test
./usr/bin/[ --help
oder/bin/[ --help
.env [ --help
sowie/usr/bin/[ --help
ganz gut funktionieren (obwohl ich zitieren muss/usr/bin/[
oder zsh sich beschwert).[
ist eigentlich häufiger alstest
Befehl bekannt. In der Regel wird dieser Befehl nur verwendet, um Ausdrücke auszuwerten und ihre Bedingung zurückzugeben - wahr oder falsch. Es wird häufig inif-then-else-fi
Anweisungen verwendet, obwohl es auch außerhalb vonif
Anweisungen verwendet werden kann, um andere Befehle über Shell-Befehle&&
oder||
Operatoren wie diese bedingt auszuführen .Insbesondere wird die Auswertung über den Exit-Status an andere Befehle übermittelt. Einige Programme geben möglicherweise den Exit-Status aus, um verschiedene Ereignistypen anzuzeigen - ein erfolgreich abgeschlossenes Programm, ein Fehler eines bestimmten Typs, der während der Ausführung auftritt, oder Syntaxfehler. Im Fall des
test
Befehls gibt es "0
wahr" und "1
falsch". Wie Stephan betonte, erzeugen Syntaxfehler den Exit-Status von2
.Die Position hängt von Ihrem System ab und erklärt auch, warum Sie die Manpage nicht gesehen haben, als Sie dies getan haben
man [
. Zum Beispiel unter FreeBSD/bin
. Unter Linux (oder in meinem speziellen Fall Ubuntu 16.04) ist es in/usr/bin/
. Wenn Sieman [
oderman test
auf einem Linux-System arbeiten, wird dieselbe Dokumentation geöffnet. Es ist auch wichtig zu beachten, dass Ihre Shell möglicherweise eine eigene Implementierung von hattest
.Es sollte auch beachtet werden, dass dieser Befehl Probleme aufweist , die durch die Implementierung der Korn-Shell (allgemein als "Bedingungsausdruck" -Referenz mit doppelten eckigen Klammern bezeichnet
[[ "$USER" = "root" ]]
) behoben werden sollen. Diese Funktion wird auch von anderen Shells wiebash
und verwendetzsh
.quelle
/usr/bin/
auch für Amazon Linux.In einigen Distributionen (zB Ubuntu)
man [
folgt ein Symlink zutest(1)
. Bei anderen (zB Arch) ist dies nicht der Fall. (Aber dietest
Manpage dokumentiert auch die Verwendung von[
)type -a [
zeigt Ihnen, dass es sowohl eine eingebaute Shell als auch eine ausführbare Datei gibt.bash-builtin gibt
[ --help
nur eine Fehlermeldung aus. (Da es sich jedoch um ein eingebautes Programm handelt, können Siehelp [
die bash-Manpage / docs verwenden oder sich diese ansehen.)/usr/bin/[ --help
gibt die vollständige Hilfeausgabe aus (für die GNU Coreutils-Version), die mit Folgendem beginnt:und beschreibt dann die erlaubte Syntax für EXPRESSION.
Dies ist ein weiterer Weg, wie Sie das herausgefunden haben
[
undtest
gleichwertig sind.Übrigens, wenn Sie bash programmieren (oder Schreiben Einzeiler interaktiv), würde ich empfehlen ,
[[
statt[
. Es ist in mehrfacher Hinsicht besser, siehe Links in Sergs Antwort.quelle
[
Der Befehl gibt den Ausgangsstatus Null zurück, wenn der in den Argumenten enthaltene Ausdruck als wahr und der in den Argumenten enthaltene Ausdruck als falsch gilt. Es schlägt auch mit einer Fehlermeldung fehl, wenn das letzte Argument nicht vorhanden ist]
(dies geschieht aus rein ästhetischen Gründen).Z.B:
… Gibt aus:
Allerdings rufen bash und viele andere Shells in diesen Fällen in der Regel nicht
/bin/[
(oder/usr/bin/[
) auf, sondern rufen den eingebauten Befehl mit genau demselben Verhalten auf (nur aus Leistungsgründen). Zum Aufrufen/bin/[
(nicht des in die Shell eingebauten Ersatzzeichens) müssen Sie entweder den Pfad explizit angeben (z/bin/[ hello ]
.]
B. müssen Sie dem Verzeichnisnamen nicht das Präfix ☺ voranstellen ) oder die Shell so konfigurieren, dass kein eingebauter Ersatzzeichen verwendet wird (z. B.enable -n [
in bash).PS: Wie schon in anderen Antworten gesagt,
[
ist das verwandt mittest
. Abertest
im Gegensatz zu[
, erfordert nicht]
als letztes Argument (und nicht erwarten , dass es überhaupt, das Hinzufügen von zusätzlichen]
zutest
Argumenten kann es dazu führen , mit der Fehlermeldung fehlschlagen oder falsches Ergebnis zurück) . Das/bin/test
und/bin/[
kann in dieselbe Datei aufgelöst werden (z. B. eine ist symbolisch verknüpft ; in diesem Fall wird die Verhaltensumleitung wahrscheinlich durch Analysieren des aktuell aufgerufenen Befehls imtest
/[
code selbst implementiert ) oder in verschiedene Dateien. Fürtest
, Shell auch beruft , in der Regel Einbau-Surrogat, es sei denn , Pfad explizit angegeben wird (/bin/test
) oder es konfiguriert ist , dies nicht zu tun (enable -n test
).PPS: Im Gegensatz zu
test
und[
ist modernif
nie eine echte Datei.if commandA; then commandB; fi
Dies ist Teil der Shell-Syntax (z. B. Bash): (Zeilenumbrüche können anstelle von Semikolons verwendet werden).commandB
Wird ausgeführt, wenn das ProgrammcommandA
mit dem Status Null verlassen wird. Dies passt perfekt zum Verhalten vontest
oder[
und erlaubt es, sie wieif [ "$a" = foo ]; then …; fi
(oderif test "$a" = foo; then …; fi
- nur weniger lesbar) zu kombinieren . Moderne Skripte verwenden jedoch häufig[[
anstelle vontest
oder[
, was (wie dasif
) nie eine echte Datei ist, sondern immer ein Teil der Shell-Syntax.PPPS: Wie für
man
- Erwarten Sie niemalsman
einen Artikel über jeden Befehl in Ihrem Dateisystem. Info auf einigen (auch „echten“, dateibasierte) Befehle fehlen möglicherweise, Informationen zu einigen Shell - Einbauten vielleicht derzeit nicht nur innerhalb eines bestimmten Schale gewidmet Artikel (das der Ort ist , wo Sie ganz sicher Infos finden auftest
,[
,if
,[[
). Dennoch haben viele Distributionen expliziteman
-Artikel fürtest
und[
. (Ungefähr--help
, es wirdtest
aus offensichtlichen Gründen nicht erkannt : Es muss leise Fälle wie behandelna=--help; test "$a"
; auf einigen Distributionen[ --help
(ohne Schließen]
) wird immer noch Hilfe angezeigt, auf einigen nicht.)quelle
if
ein Befehl bis zu Unix V6 war. Unix V7 (1979) wurde mit der Bourne-Shell (mit ihremif-then-else-fi
Konstrukt) und dem neuentest
Befehl geliefert.