Obecnie używam tego, aby wyświetlić aktualny czas w wierszu polecenia bash:
PS1=\[\e[0;32m\]\t \W>\[\e[1;37m\]
20:42:23 ~>
Czy można wyświetlić czas, który upłynął od poprzedniego monitu? Jak na przykład:
00:00:00 ~> sleep 10
00:00:10 ~> sleep 20
00:00:20 ~>
To nie ma nic wspólnego z Czy można okresowo zmieniać PS1 za pomocą skryptu w tle?
Odpowiedzi:
Jednym ze sposobów jest użycie funkcji bash PROMPT_COMMAND do wykonania kodu modyfikującego PS1. Poniższa funkcja to zaktualizowana wersja mojego oryginalnego zgłoszenia; ten używa dwóch mniej zmiennych środowiskowych i poprzedza je „_PS1_”, aby uniknąć blokowania istniejących zmiennych.
Umieść to w swoim pliku .bash_profile, aby rozpocząć.
Zauważ, że musisz dość szybko pisać, aby
sleep
parametr pasował do parametru zachęty - czas naprawdę różni się między monitami, w tym czas potrzebny na wpisanie polecenia.Późne dodanie:
W oparciu o teraz usuniętą odpowiedź @Cyrus, oto wersja, która nie zaśmieca środowiska dodatkowymi zmiennymi:
Dodatkowe opóźnienie:
Począwszy od wersji bash 4.2 (
echo $BASH_VERSION
), możesz uniknąćdate
wywołań zewnętrznych za pomocą nowego ciągu formatu printf; zamień$(date +%s)
elementy na$(printf '%(%s)T' -1)
. Począwszy od wersji 4.3 , można pominąć-1
parametr polegający na zachowaniu „brak argumentu teraz ”.źródło
$SECONDS
przestaje on śledzić czas od uruchomienia powłoki,$SECONDS
dla każdego monitu może wywołać nieoczekiwane zachowania. każda inna funkcja powłoki, która mogłaby jej użyć z jakiegokolwiek powodu związanego z oceną czasu wykonywania, będzie działała nieprawidłowo.Obsługuje formatowanie według obliczeń - więc, chociaż rozszerza się kilka razy, nie robi żadnych podpowłok ani potoków.
Po prostu traktuje
$PS1
jak tablicę i wykorzystuje wyższe indeksy do przechowywania / obliczania dowolnego / wszystkich niezbędnych stanów między podpowiedziami. Nie ma to wpływu na żaden inny stan powłoki.Mogę to trochę zepsuć ...
Najpierw zapisz bieżącą wartość
$SECONDS
:Następnie zdefiniuj,
$PS1[0]
aby był rekurencyjny w sposób, który zawsze ustawi odpowiednie wartości,$PS1[1-3]
a jednocześnie będzie zawierał odnośniki. Aby uzyskać tę część, musisz wziąć pod uwagę kolejność, w jakiej wyrażenia matematyczne są obliczane. Co najważniejsze, matematyka w powłoce jest zawsze ostatnim rodzajem biznesu dla matematyki w powłoce. Przede wszystkim powłoka rozszerza wartości. W ten sposób możesz odwoływać się do starej wartości zmiennej powłoki w wyrażeniu matematycznym po przypisaniu jej za pomocą$
.Oto pierwszy prosty przykład:
Powłoka oceni tę instrukcję, najpierw podstawiając wartość
$x
wszędzie tam, gdzie$
używane jest odwołanie do znaku dolara, a zatem wyrażenie staje się:... wtedy powłoka dodaje 5 do wartości,
$x
a następnie rozwija całe wyrażeniex+10+x
, zachowując tylko faktycznie przypisaną wartość w zmiennej referencyjnej. Zatem rozszerzona wartość wyrażenia matematycznego wynosi 40, ale ostateczna wartość$x
to 15.Tak w dużej mierze
$PS1
działa również równanie, z tym wyjątkiem, że w indeksach tablicowych wykorzystywany jest dalszy poziom rozszerzenia / oceny matematyki.Nie jestem do końca pewien, dlaczego zdecydowałem się
PS1[1]=!1
tam użyć - wydaje mi się, że była to po prostu głupia estetyka - ale przypisuje to 0$PS1[1]
podczas rozszerzania go do podstawiania parametrów. Wartość bitowego AND dla 0 i cokolwiek innego zawsze będzie wynosić 0, ale nie zwiera się jak wartość logiczna&&
, gdy skrajnie lewe pierwsze to 0, więc wyrażenie w nawiasie wciąż jest oceniane za każdym razem. Jest to oczywiście ważne, ponieważ w pierwszej elipsie$PS1[2,3]
ustawiane są wartości początkowe .W każdym razie
$PS1[1]
zapewnione jest, że wynosi 0, nawet jeśli jest sfałszowane w / między kolejnymi losowaniami. W nawiasach znajdują się ......
$PS1[2]
przypisano różnicę$PS1[3]
i$SECONDS
oraz$PS1[3]
przypisano mu iloraz tej wartości i 3600. Wszystkie wartości są tutaj inicjowane. A więc:... jeśli są co najmniej dwie cyfry,
$PS1[3]
wówczas wewnętrzne rozwinięcie jest zerowe, a ponieważ wiemy, że$PS1[1]
wynosi 0, to jeśli$PS1[3]
można je zastąpić niczym, to także jest$PS1[1]
ono rozwinięte do wartości. W ten sposób tylko wartości jednocyfrowe dla każdej iteracji$PS1[3]
przypisań zwiększą początkowe zero, a$PS1[3]
samo jest bezpośrednio rozszerzone modulo 60 zaraz po tym, jednocześnie przypisując kolejną kolejno mniejszą wartość dla każdej godziny, minuty, sekundy.Opłucz i powtórz, aż do ostatniej iteracji, w której
$PS1[3]
zostanie nadpisana w / bieżąca wartość,$SECONDS
aby można ją było porównać z$SECONDS
jeszcze raz, gdy zostanie narysowany monit.źródło
Najlepsze rozwiązanie, jakie do tej pory znalazłem, to: https://github.com/jichu4n/bash-command-timer
Który drukuje
[ 1s011 | May 25 15:33:44 BST ]
aka czas, który upłynął po prawej stronie po wykonaniu polecenia, więc nie zaśmieca PS1.Cały ciąg i format czasu można konfigurować. Nawet kolor i precyzja są konfigurowalne. Wiem, że może to być trochę dla niektórych minimalistów, ale jest całkiem fajne.
źródło