Twoje opcje tutaj będą zależeć od twojej powłoki. W zsh
tam 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 tmux
czy 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 popreexec
powrocie. Więc najlepsze, co możemy zrobić, to coś podobnego.