
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äuft
date 2
, was kein gültiger Aufruf istdate
und 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 $0
und den Code so zerstörungsfrei auszuführen, indem Sie Bash mit der -c
Option aufrufen: bash -c "$(<test.bash)" output-file
Die 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 bash
die 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&>$0
wird wie folgt interpretiert:
Der
date
Befehl wird mit dem Argument ausgeführt2
Die gesamte Ausgabe (sowohl stdout als auch stderr) des Datumsbefehls wird in die Datei umgeleitet
$0
.$0
ist der Name des aktuellen Skripts.Das Symbol
>
zeigt standardmäßig die Umleitung von stdout an. Alsbash
Erweiterung ist das Symbol&>
eine Abkürzung für die Umleitung vonbeidestdout und stderr. Folglich werden sowohl stdout als auch stderr zur Datei umgeleitet$0
.Sobald die Skriptdatei überschrieben wurde, handelt es sich nicht mehr um ein gültiges Skript und es
bash
wird eine Meldung über die fehlerhaften Befehle ausgegeben.
Unterschied zwischen bash
und POSIX-Shells
Bei einer einfachen POSIX-Shell wie wird dash
die Verknüpfung &>
nicht unterstützt. Daher date 2&>$0
leitet der Befehl umnurstdout in die Datei $0
. In diesem Fall bedeutet das, dass die Skriptdatei mit einer leeren Datei überschrieben wird, während die date
Fehlermeldung auf dem Terminal angezeigt wird.