Ihre Optionen hier hängen von Ihrer Shell ab. Dort zsh
gibt es eine praktische Hook-Funktion preexec()
, die direkt vor allen interaktiven Shell-Befehlen ausgeführt wird. Durch das Erstellen einer Funktion mit diesem Namen können Sie die Ausführung von Dingen veranlassen. Sie können auch eine Funktion aufrufen, precmd()
die unmittelbar vor dem Zeichnen der nächsten Eingabeaufforderung ausgeführt wird und direkt nach Beendigung Ihres Befehls ausgeführt wird.
Durch Erstellen dieses Funktionspaars können Sie beliebige Befehle ausführen lassen, bevor und nachdem Befehle an der Eingabeaufforderung ausgegeben werden. Sie können dies verwenden, um die Shell-Nutzung zu protokollieren, Sperren zu erstellen, die Umgebung zu testen oder wie in Ihrem Beispiel die Zeit oder Ressourcen zu berechnen, die während der Ausführung eines Befehls aufgewendet werden.
In diesem Beispiel erstellen wir uns einen Benchmark-Zeitstempel, bevor wir einen Befehl preexec()
ausführen, precmd()
und berechnen dann die Zeit, die für die Ausführung des Befehls aufgewendet wurde, und geben ihn vor der Eingabeaufforderung aus oder protokollieren ihn ab. Beispiel:
preexec() {
CMDSTART=$(date +%s%N)
}
precmd() {
CMDRUNTIME=$(($(date +%s%N)-$CMDSTART))
echo "Last command ran for $CMDRUNTIME nanoseconds."
}
Hinweis: In diesem Beispiel gibt es eine noch einfachere integrierte Funktion. Alles, was Sie tun müssen, ist die Laufzeitberichterstattung in ZSH zu aktivieren, und dies wird automatisch durchgeführt.
$ export REPORTTIME=0
$ ls -d
./
ls -BF --color=auto -d 0.00s user 0.00s system 0% cpu 0.002 total
In einer praktischeren Implementierung von preexec()
benutze ich es, um zu sehen, ob die Shell in tmux
oder läuftscreen
um Informationen über den aktuell ausgeführten Befehl zu senden, die im Registerkartennamen angezeigt werden sollen.
Leider existiert dieser kleine Mechanismus in Bash nicht. Hier ist der Versuch eines Mannes, es zu replizieren . Siehe auch Gilles 'Antwort für einen ähnlichen kleinen Hack.
preexec
, aber Sie möchten es nicht innerhalb vonpreexec
(z. B.preexec() { time $1; }
) ausführen , da die Shell es nach derpreexec
Rückkehr immer noch ausführt. Das Beste, was wir tun können, ist etwas Ähnliches.