Was bedeutet „if [ -n "$(which voltdb 2> /dev/null)" ];“?

Was bedeutet „if [ -n "$(which voltdb 2> /dev/null)" ];“?

Ich verfüge über sehr grundlegende Linux-Kenntnisse und versuche nun, einige Shell-Skripte zu analysieren. In einem der Skripte sehe ich diese Zeile:

if [ -n "$(which voltdb 2> /dev/null)" ];

Ich weiß, dass /dev/null der Bit-Bucket ist und dass dieser den Pfad ausgibt, der ausgeführt worden wäre, wenn ich voltdb in der Befehlszeile ausgeführt hätte. Außerdem ist die ganze Zeile offensichtlich eine if-Anweisung. Aber viele andere Dinge hier verwirren mich.

  1. Warum wird 2 mit /dev/null verglichen? Dies scheinen inkompatible Typen zu sein.
  2. Was macht der Schalter -n? Ich bin es gewohnt, Schalter wie rm -r Dateiname zu verwenden, aber -n scheint mit keinem Befehl zu koppeln
  3. Was machen die Klammern? Sie scheinen hier etwas anderes zu bedeuten als in diesem AusdruckWas bedeutet dieser Testausdruck []?

Was macht diese Zeile im Grunde? Für mich gibt es darin zu viele Unbekannte – es ist ein bisschen so, als würde man einen Satz in einer Fremdsprache hören und dabei so viele Wörter verpassen, dass man die Grundstruktur nicht mehr versteht.

Antwort1

In diesem Codefragment ist eine Menge los. Von innen nach außen:

which voltdb 2> /dev/null- Der hier ausgeführte Befehl ist which. whichWenn aufgerufen, durchsucht er alle Einträge in der PATHUmgebungsvariable, um einen Befehl namens „voltdb“ zu finden. Wenn er eine ausführbare Datei namens „voltdb“ in einem der in genannten Verzeichnisse findet PATH, wird der vollqualifizierte Name der voltdbausführbaren Datei gedruckt.

Um Ihre Frage Nr. 1 zu beantworten: „2>“ ist ein Beispiel für eine Umleitung. Jeder Unix/Linux/*BSD-Prozess hat 3 Standardeingaben und -ausgaben, 0 ist stdin, 1 ist stdout, 2 ist stderr. Programme, die auf der Befehlszeile ausgeführt werden sollen, drucken Fehlermeldungen normalerweise an stderr. „2> /dev/null“ vergleicht also nicht numerisch 2 mit „/dev/null“, sondern sendet alle whichFehlerausgaben an /dev/null, eine spezielle Datei, die einfach alle Eingaben verarbeitet und 0 Bytes Ausgabe zurückgibt.

Abgesehen davon $(...)bedeutet die Konstruktion: „Führen Sie den eingeschlossenen Befehl aus und ersetzen Sie jede Ausgabe genau hier zwischen ‚$(‘ und ‚)‘ lexikalisch.“ Das ist eine Ausgabesubstitution, die Shell-Programme durchführen.

Außerhalb der Ausgabesubstitution führt das Fragment Folgendes aus if [ -n "something" ];, wobei „etwas“ whichausgegeben worden wäre. Das „if“ ist eine Shell-Flusssteuerungskonstruktion, die dazu führt, dass ein Codeblock ausgeführt wird, wenn die Befehlspipeline nach dem „if“ mit dem Status „erfolgreich“ beendet wird.

Das [ist eigentlich eine ausführbare Datei, die sich Befehlszeilenargumente bis zum ansieht ]. Das Flag „-n“ bedeutet normalerweise „true bei nächstem Argument mit einer Zeichenfolgelänge ungleich Null“. Das ist die Antwort auf Ihre Fragen Nr. 2 und Nr. 3. Die [ ... ]Konstruktion gibt auf einige logische Bedingungen die Antworten „true“ (Beenden mit Erfolgscode) oder „false“ (Beenden mit Fehlercode) aus, in diesem Fall „Zeichenfolgenlänge ungleich Null“.

Letztendlich würde dieses Fragment die „true“-Klausel eines if-then-fi- oder if-then-else-fi-Kontrollflusses ausführen, wenn der PATH dieser Shell ein Verzeichnis mit einer voltdbausführbaren Datei enthält.

Antwort2

Dieser Code führt Folgendes aus:

if [ -n "...." ];

Die if-Anweisung ist wahr, wenn das Ergebnis des Codes bei Ausführung in Anführungszeichen leer ist.

Der Code in den Anführungszeichen:

$(which voltdb 2> /dev/null)

Führt den which voltdbBefehl aus und leitet alle Ausgaben dieses Befehls, die auf STDERR (Standardfehler) auftreten, an um /dev/null. Im Grunde sind wir daran nicht interessiert, also ignorieren wir es.

Die Ergebnisse which voltdbgeben den Pfad zu jeder ausführbaren Datei in Ihrem PATH zurück, die mit der Zeichenfolge „voltdb“ übereinstimmt.

Beispiel

$ which time
/usr/bin/time

$ which time 2> /dev/null
/usr/bin/time

Was ist mit 2>?

2>ist eine Kurzform für die Umleitung der Ausgabe eines derStreamsdas automatisch für ein Programm eingerichtet wird, wenn es ausgeführt wird. Die Streams sind wie folgt:

  • 0 – Standardeingang (auch bekannt als STDIN)
  • 1 - Standardausgang (auch bekannt als STDOUT)
  • 2 - Standardfehler (auch bekannt als STDERR)

Wenn Sie also die Ausgabe von STDERR übernehmen und loswerden möchten:

$ which time 2> /dev/null

Wenn Sie die Ausgabe von STDOUT nehmen und an STDERR umleiten möchten:

verwandte Informationen