Gibt es eine Möglichkeit, den zuletzt ausgeführten Befehl ggf. zusammen mit den Argumenten innerhalb eines KSH-Skripts abzurufen? Ich verwende MKSH mit Cygwin.
Ich habe es versucht fc -nl -1
, aber das Skript gibt den Fehler „fc: Verlaufsfunktionen nicht verfügbar“ aus.
Ich sehe kein Äquivalent der BASH_COMMAND
Variable in ksh.
Hier ist der Auszug aus dem Skript:
function trapper ()
{
printf "culprit: "
fc -nl -1
}
trap trapper ERR
grep -ic textdoesntexist test3
Trapper wird ausgeführt, sobald grep 1 zurückgibt, aber ich erhalte die Fehlermeldung „fc: Verlaufsfunktionen nicht verfügbar“.
Alsvon Lee hervorgehoben, hist
könnte nützlich sein, aber es istnur mit ksh93 verfügbar, die ich nicht verwenden darf.
Ich habe es versucht, indem ich die Befehlszeilenzeichenfolge in einer Variablen gespeichert und diese Variable innerhalb der Trapper-Funktion verwendet habe.
function err_handler
{
echo "ERR in ${cmd} trapped"
cmd=
return 0
}
trap err_handler EXIT ERR
cmd="grep -ic testdoesntexist test3"
${cmd} &>/dev/null
Es funktioniert, aber ich finde es irgendwie hässlich. Gibt es einen besseren Ausweg?
Antwort1
mksh
Autor hier ☻
Das fc
integrierte Dienstprogramm greift auf den interaktiven Befehlszeilenverlauf zu. Wie Sie vielleicht schon am Namen erraten haben, ist dies für Skripte nicht verfügbar, da diese anders (viel effizienter) analysiert werden.
Im Allgemeinen können Sie in einem Skriptstetskenne die letzte Zeile jedenfalls ;)
Wenn Sie Zugriff auf den Verlauf einer interaktiven Shell benötigen, definieren Sie einen Alias oder vorzugsweise eine Funktion in .profile
oder .mkshrc
.
In Ihrem speziellen Fall schlage ich vor, eine explizite Fehlerbehandlung zu verwenden, etwa:
grep -ic textdoesntexist test3 || die 'Could not grep in test3'
UndBitte WirklichVermeiden Sie die Verwendung des GNU-Bash-Kompatibilitätsidioms &>
als Umleitungsoperator. Es dient nur der Kompatibilität, nicht neuen Skripten und verschwindet -o posix
bereits im Modus. Das Parsen kann vorhandene gültige POSIX-Skripte beschädigen.