Holen Sie sich die zuletzt ausgeführte Befehlszeile in ksh

Holen Sie sich die zuletzt ausgeführte Befehlszeile in ksh

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_COMMANDVariable 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, histkö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

mkshAutor hier ☻

Das fcintegrierte 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 .profileoder .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 posixbereits im Modus. Das Parsen kann vorhandene gültige POSIX-Skripte beschädigen.

verwandte Informationen