Die $?
Variable enthält den Exit-Status des letzten Ausführungsbefehls. Gibt es eine Variable, die den letzten Ausführungsbefehl selbst enthält?
bash
shell
scripting
environment-variables
Eimantas
quelle
quelle
Antworten:
Verwenden Sie
fc
diese Option , um die vorherige Befehlszeile abzurufen. Es wird normalerweise verwendet, um die vorherige Befehlszeile in Ihrem bevorzugten Editor zu bearbeiten, hat aber auch einen "Listen" -Modus:last_command="$(fc -nl -1)"
quelle
caller
und der Bash - ArraysBASH_LINENO
,BASH_SOURCE
undFUNCNAME
eine Art von Stack - Trace zu tun.Wenn der letzte Befehl ohne Argumente ausgeführt wurde, wird er in der
$_
Variablen gespeichert . Dies enthält normalerweise das letzte Argument des vorherigen Befehls. Wenn also keine Argumente vorhanden waren, ist der Wert von$_
der letzte Befehl selbst.Eine andere Möglichkeit besteht darin, die Details des letzten Hintergrundbefehls zu erfahren . Wie l0b0 schrieb,
$!
hält seine PID - so können Sie die Ausgabe von analysierenps $!
(möglicherweise mit zusätzlichen Formatierungsoptionen zups
).quelle
Nein, aber Sie können es während der Ausführung zum Speichern für andere Befehle erhalten:
$0
: Pfad des aktuellen Shell-Skripts.$FUNCNAME
: "Name der aktuellen Funktion.""$@"
: Alle Parameter des aktuellen Befehls werden separat angegeben.$!
: "PID (Prozess-ID) des letzten im Hintergrund ausgeführten Jobs."$$
: "Prozess-ID (PID) des Skripts selbst."Der vollständige Befehl des aktuellen Skripts sollte daher lauten
"$0" "$@"
. Wenn es eine Funktion ist, sollte es sein"$FUNCNAME" "$@"
. Möglicherweise möchten Sie dies für die zukünftige Verarbeitung in einem Array speichern. Speichern Sie dies beispielsweise intest.sh
:Beim Ausführen
./test.sh "first argument" "second argument"
sollte Folgendes zurückgegeben werden:Welches sind gleichwertige Anrufe.
quelle
BASH_COMMAND
Variable, die aber abgesehen von der Verwendung in Fallen in keiner Weise nützlich zu sein scheint.some-command
in einem Shell-Skript ausgeführt werde und es fehlschlägt ? Ich habe einen Status ungleich Null in$?
. Wird "Nein" immer noch für das Vorhandensein von variablem Halten geltensome-command
?Mit dem
DEBUG
Trap können Sie einen Befehl unmittelbar vor einer einfachen Befehlsausführung ausführen. In derBASH_COMMAND
Variablen ist eine Zeichenfolgenversion des auszuführenden Befehls (mit durch Leerzeichen getrennten Wörtern) verfügbar .Beachten Sie, dass
previous_command
sich dies jedes Mal ändert, wenn Sie einen Befehl ausführen. Speichern Sie ihn daher in einer Variablen, um ihn zu verwenden. Wenn Sie auch den Rückgabestatus des vorherigen Befehls wissen möchten, speichern Sie beide in einem einzigen Befehl.Wenn Sie nur bei fehlgeschlagenen Befehlen abbrechen möchten, verwenden Sie diese Option
set -e
, um das Skript beim ersten fehlgeschlagenen Befehl zu beenden. Sie können den letzten Befehl aus derEXIT
Trap anzeigen .Ein alternativer Ansatz, der für einige Verwendungszwecke geeignet sein könnte, besteht darin
set -x
, eine Ablaufverfolgung der Skriptausführung zu drucken und die letzten Zeilen der Ablaufverfolgung zu untersuchen.quelle
Ich finde es wichtig, den letzten fehlgeschlagenen Befehl zu finden, wenn ich
set -e
undset -o pipefail
Optionen habe, da sonst bash einfach abgebrochen wird, ohne Rückmeldung darüber, warum. Deshalb habe ich festgestellt, dass dies gut funktioniert:Wenn Sie die oben genannten Schritte ausführen, wird am Ende die folgende Ausgabe angezeigt:
Die Zeilennummer ist möglicherweise nicht immer genau, sollte Ihnen jedoch nahe genug sein, um nützlich zu sein.
quelle