Was macht `date 2&>$0`?

Was macht `date 2&>$0`?

Ich schaue mir den Shell-Code eines Kollegen an und habe Folgendes gesehen:

date 2&>$0

Ich weiß, was date macht, aber was macht 2&>$0? Er ist für eine Weile weg, also kann ich ihn nicht fragen, worum es in diesem Teil ging.

Antwort1

Vorausgesetzt, der von Ihnen gepostete Code ist korrekt, ist das, was er tut, sehr seltsam. Er:

  • Läuftdate 2, was kein gültiger Aufruf ist dateund eine Fehlermeldung erzeugt, dann
  • Leitet sowohl die Standardausgabe als auch die Standardfehlermit&>,
  • In die Datei, die das laufende Skript enthält ($0), wobei der vorhandene Inhalt gelöscht wird.

Da Bash das Skript so einliest, dass jeweils nur eine Zeile aus der Datei entnommen wird, führt dies dazu, dass es aus der überschriebenen Datei Unsinn herausliest und wahrscheinlich beendet wird (weil die Datei auf eine Stelle gekürzt wurde, die kürzer ist als die Stelle, an der diese Zeile erschien) oder einen Syntaxfehler ausgibt (wenn das Original sehr kurz war und ein Teil des Fehlers als nächste Zeile eingelesen wird).

Mir fällt keine einzige legitime Verwendung für diese Zeile ein, aber Sie sagen, Sie haben sie genau so wiedergegeben, wie sie geschrieben steht, und das ist ihr Zweck.


Genau genommen ist es möglich, einen anderen Wert zuzuweisen $0und den Code so zerstörungsfrei auszuführen, indem Sie Bash mit der -cOption aufrufen: bash -c "$(<test.bash)" output-fileDie Fehlermeldung wird in eingefügt output-file. Dies wäre jedoch völlig pervers.

Antwort2

Zusammenfassung

Wenn sich dieser Befehl in einem Skript befindet, wird bashdie Skriptdatei mit einer Fehlermeldung überschrieben.

Beispiel

Betrachten Sie das Skript:

$ cat test.sh
date 2&>$0

Führen Sie jetzt das Skript aus:

$ bash test.sh
test.sh: line 2: unexpected EOF while looking for matching ``'
test.sh: line 3: syntax error: unexpected end of file

Beachten Sie den neuen Inhalt des Skripts:

$ cat test.sh
date: invalid date `2'

Erläuterung

Der Befehl date 2&>$0wird wie folgt interpretiert:

  1. Der dateBefehl wird mit dem Argument ausgeführt2

  2. Die gesamte Ausgabe (sowohl stdout als auch stderr) des Datumsbefehls wird in die Datei umgeleitet $0. $0ist der Name des aktuellen Skripts.

    Das Symbol >zeigt standardmäßig die Umleitung von stdout an. Als bashErweiterung ist das Symbol &>eine Abkürzung für die Umleitung vonbeidestdout und stderr. Folglich werden sowohl stdout als auch stderr zur Datei umgeleitet $0.

  3. Sobald die Skriptdatei überschrieben wurde, handelt es sich nicht mehr um ein gültiges Skript und es bashwird eine Meldung über die fehlerhaften Befehle ausgegeben.

Unterschied zwischen bashund POSIX-Shells

Bei einer einfachen POSIX-Shell wie wird dashdie Verknüpfung &>nicht unterstützt. Daher date 2&>$0leitet der Befehl umnurstdout in die Datei $0. In diesem Fall bedeutet das, dass die Skriptdatei mit einer leeren Datei überschrieben wird, während die dateFehlermeldung auf dem Terminal angezeigt wird.

verwandte Informationen