Was macht diese Shell-Skriptzeile?

1

ls "$ {VMX_DIR}" | grep -q Delta & gt; / dev / null 2 ​​& gt; & amp; 1;

Es listet die Dateien in VMX_DIR auf und leitet sie dann an grep weiter, aber was macht es?

t123
quelle

Antworten:

4

Es wird geprüft, ob eine Datei oder ein Pfad enthalten ist delta im ${VMX_DIR} Gibt dann das Ergebnis über den Exit-Code von grep zurück, da grep mit dem normalen Exit-Code 0 zurückgibt, wenn eine Übereinstimmung gefunden wird, und mit dem Fehlercode 1, wenn dies nicht der Fall ist. Es ist nützlich bei Bash-Bedingungen.

Hier ist, was es Aussage für Aussage tut:

ls "$ {VMX_DIR}"

Listet den Inhalt des im Pfad gespeicherten Verzeichnisses auf ${VMX_DIR}

| grep -q Delta

Leiten Sie die Ergebnisse an grep weiter und durchsuchen Sie die Ergebnisse der Verzeichnisliste nach delta Ignoriert jede Ausgabe zu stark.

& gt; / dev / null 2 ​​& gt; & amp; 1;

Leitet stdout zu um /dev/null es wird also nicht gedruckt. Das 2>&1 Weist bash an, stderr an stdout umzuleiten (was jetzt geschieht) /dev/null ). Das Semikolon beendet nur die Zeile.

David Ma
quelle
2

Von dem grep Manpage:

   -q, --quiet, --silent
          Quiet;  do  not write anything to standard output.  Exit immedi-
          ately with zero status if any match is found, even if  an  error
          was detected.  Also see the -s or --no-messages option.

Grundsätzlich wird nach einem Dateinamen gesucht, der diesen enthält delta und zurückkehren true wenn da ist oder false wenn nicht. Was es mit diesem Wahrheitswert tatsächlich zu tun hat, ist die Vermutung, die jemand von dem kleinen Ausschnitt hat, den Sie dort haben.

Majenko
quelle
0

Es sieht so aus, als ob nur festgestellt werden soll, ob das Wort 'Delta' in der Liste enthalten ist. In diesem Fall wird 0 zurückgegeben, andernfalls wird 1 zurückgegeben. Anhand des Rückgabewerts wissen Sie also, ob Delta vorhanden war oder nicht.

steabert
quelle
0

Der letzte Teil leitet um Standardausgabe und Standardfehler zu / dev / null - Das heißt, alle Ausgaben des Befehls grep (Fehler, Warnungen oder Übereinstimmungen) werden verworfen. Diese Art von Befehl kann nützlich sein, um eine einfache Prüfung ohne Ausgabe durchzuführen $? Variable wird Null oder nicht Null sein, je nachdem, ob die grep gelungen oder nicht.

Sie können diesen Code durch Ersetzen vereinfachen > /dev/null 2>&1 mit &>/dev/null, was in diesem Fall dasselbe bewirkt: Alle Ausgabestreams umleiten zu /dev/null.

Sehen E / A-Umleitung für Details.

l0b0
quelle