Czy można przymusowo dodać alias czasu (z braku lepszego sposobu wyrażenia go) do każdego polecenia w bash
?
Na przykład chciałbym mieć konkretnego użytkownika, który za każdym razem, gdy uruchamiane jest polecenie, zawsze jest zawinięte date
przed i po nim lub time
.
Czy to możliwe, a jeśli tak, to w jaki sposób?
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.preexec()
funkcji, aby otoczyć wszystko, co było wykonywane, pobierając polecenie, uruchamiając je z wnętrza funkcji, a następnie zwracając jakiś błąd, aby powłoka nie wykonała samego polecenia.Odpowiedzi:
Możesz zarejestrować czas uruchomienia wiersza poleceń i czas wyświetlania monitu. Bash już śledzi datę rozpoczęcia każdego wiersza poleceń w swojej historii i możesz zanotować czas, kiedy wyświetlasz następny monit.
Daje to tylko drugą rozdzielczość i tylko czas zegara ściennego. Jeśli chcesz uzyskać lepszą rozdzielczość, musisz użyć zewnętrznego
date
polecenia obsługującego%N
format nanosekund orazDEBUG
pułapki, którą należy wywołaćdate
przed uruchomieniem polecenia na czas.Nawet przy
DEBUG
pułapce nie sądzę, aby istniał sposób automatycznego wyświetlania czasów procesora dla każdego polecenia lub bardziej dyskryminujący niż monit o monit.Jeśli chcesz użyć innej powłoki, oto jak uzyskać raport czasu dla każdego polecenia w zsh (nie uogólnia to na inne zadania):
Można ustawić
REPORTTIME
dowolną wartość całkowitą, informacje o taktowaniu będą wyświetlane tylko dla poleceń, które wykorzystały więcej niż tyle sekund czasu procesora.Zsh wziął tę funkcję z csh, w którym wywoływana jest zmienna
time
.źródło
Twoje opcje tutaj będą zależeć od twojej powłoki. W
zsh
tam wygodna funkcja nazywa się hakpreexec()
, 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 nazwieprecmd()
, 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 poleceniaprecmd()
i wyprowadzimy go przed pytaniem lub wylogujemy. Przykład: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.
W bardziej praktycznej realizacji
preexec()
, używam go zobaczyć jeśli powłoka jest uruchomiony wewnątrztmux
czyscreen
, 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.
źródło
Najłatwiej byłoby to ustawić
PROMPT_COMMAND
. Zobacz zmienne Bash :Na przykład, aby uniknąć zastąpienia dowolnego istniejącego polecenia, możesz:
źródło
csh
/tcsh
ma najlepsze wsparcie dla tej funkcji (i zawsze ją miał).Innymi słowy,
set time=1
wydrukuje czas zajęty (system, użytkownik, który upłynął) przez dowolne polecenie, które zajęło więcej niż 1 sekundę czasu procesora. Zwykłyset time
umożliwi wydrukowanie czasu dla wszystkich poleceń.źródło