Ich schaue mir einen Mitarbeiter-Shell-Code an und habe Folgendes gesehen:
date 2&>$0
Ich weiß, welches Datum es tut, aber was macht 2 &> $ 0? Er ist eine Weile weg, also kann ich ihn nicht fragen, worum es in diesem Teil ging.
Ich schaue mir einen Mitarbeiter-Shell-Code an und habe Folgendes gesehen:
date 2&>$0
Ich weiß, welches Datum es tut, aber was macht 2 &> $ 0? Er ist eine Weile weg, also kann ich ihn nicht fragen, worum es in diesem Teil ging.
date 2>/dev/null
, um eine fehlerfreie Datumsausgabe zu erzeugen, und fehlgeschlagene Spektren.Antworten:
Zusammenfassung
Befindet sich
bash
dieser Befehl in einem Skript, wird die Skriptdatei mit einer Fehlermeldung überschrieben.Beispiel
Betrachten Sie das Skript:
Führen Sie nun das Skript aus:
Beachten Sie den neuen Inhalt des Skripts:
Erläuterung
Der Befehl
date 2&>$0
wird wie folgt interpretiert:Der
date
Befehl wird mit Argument ausgeführt2
Alle Ausgaben, sowohl stdout als auch stderr, vom Befehl date werden in die Datei umgeleitet
$0
.$0
ist der Name des aktuellen Skripts.Das Symbol
>
zeigt standardmäßig die Umleitung von stdout an. Alsbash
Erweiterung, das Symbol&>
ist eine Verknüpfungsanzeige Umleitung von sowohl stdout und stderr. Folglich werden sowohl stdout als auch stderr in die Datei umgeleitet$0
.Sobald die Skriptdatei überschrieben wurde, ist sie nicht mehr gültig und
bash
beschwert sich über die fehlerhaften Befehle.Unterschied zwischen
bash
und POSIX-ShellsBei einer einfachen POSIX-Shell wie
dash
wird die Verknüpfung&>
nicht unterstützt. Daherdate 2&>$0
leitet der Befehl nur stdout in die Datei um$0
. In diesem Fall bedeutet dies, dass die Skriptdatei mit einer leeren Datei überschrieben wird, während diedate
Fehlermeldung auf dem Terminal angezeigt wird.quelle
Unter der Annahme, dass der von Ihnen eingegebene Code korrekt ist, ist das, was er tut, sehr seltsam. Es:
date 2
, was kein gültiger Aufruf von istdate
und was dann eine Fehlermeldung erzeugt&>
,$0
), löschen Sie den vorhandenen Inhalt.Da Bash das Skript so einliest, dass jeweils eine Zeile aus der Datei entnommen wird, wird die überschriebene Datei unsinnig und wird möglicherweise beendet (weil die Datei auf einen kürzeren Wert als den Punkt gekürzt wurde, an dem diese Zeile angezeigt wurde) oder Angabe eines Syntaxfehlers (wenn das Original sehr kurz war und ein Teil des Fehlers als nächste Zeile eingelesen wird).
Ich kann mir keine einzige legitime Verwendung für diese Zeile vorstellen, aber wie Sie sagen, Sie haben sie genau so angegeben, wie sie geschrieben steht, ist es das, was sie bewirkt.
Genau genommen ist es möglich
$0
, diesem Code einen anderen Wert zuzuweisen und ihn zerstörungsfrei auszuführen, indem Bash mit der-c
Option aufgerufen wird:bash -c "$(<test.bash)" output-file
Die Fehlermeldung wird eingefügtoutput-file
, aber es ist absolut verkehrt, dies zu tun.quelle