Twoje opcje tutaj będą zależeć od twojej powłoki. W zshtam wygodna funkcja nazywa się hak preexec(), który jest prowadzony tuż przed wszelkich interaktywnych poleceń powłoki. Tworząc funkcję o tej nazwie, możesz powodować wykonywanie zadań. Można również śledzić z funkcji o nazwie precmd(), która będzie działać tuż przed następnym wierszu jest zasysane, który będzie tuż po swoim wykończeń dowodzenia.
Tworząc tę parę funkcji, możesz mieć dowolne dowolne polecenia, które chcesz uruchamiać przed i po każdym poleceniu wydanym w wierszu polecenia. Możesz użyć tego do rejestrowania użycia powłoki, tworzenia blokad, testowania środowiska lub, jak w twoim przykładzie, obliczania czasu lub zasobów spędzonych podczas wykonywania polecenia.
W tym przykładzie utworzymy sobie znacznik czasu testu przed uruchomieniem polecenia, preexec()a następnie obliczymy czas spędzony na wykonaniu polecenia precmd()i wyprowadzimy go przed pytaniem lub wylogujemy. Przykład:
preexec() {
CMDSTART=$(date +%s%N)
}
precmd() {
CMDRUNTIME=$(($(date +%s%N)-$CMDSTART))
echo "Last command ran for $CMDRUNTIME nanoseconds."
}
Uwaga: W tym konkretnym przykładzie jest jeszcze łatwiejsza funkcja wbudowana. Wszystko, co musisz zrobić, to włączyć raportowanie w czasie wykonywania w ZSH, a zrobi to automatycznie.
$ export REPORTTIME=0
$ ls -d
./
ls -BF --color=auto -d 0.00s user 0.00s system 0% cpu 0.002 total
W bardziej praktycznej realizacji preexec(), używam go zobaczyć jeśli powłoka jest uruchomiony wewnątrz tmuxczy screen, a jeżeli tak, aby wysyłać informacje o aktualnie uruchomionego polecenia Upstream ma być wyświetlany w nazwie karty.
Niestety w bash ten mały mechanizm nie istnieje. Oto próba powielenia przez jednego człowieka . Zobacz także odpowiedź Gillesa na podobny fajny mały hack.
preexec, ale nie chcesz uruchamiać go wpreexec(np.preexec() { time $1; }), Ponieważ powłoka nadal uruchamia go popreexecpowrocie. Więc najlepsze, co możemy zrobić, to coś podobnego.