Nevím, jak je to v bash, ale v zsh lze definovat preexec
a precmd
funkce tak, že uloží aktuální čas do proměnných $STARTTIME
(preexec) a $ENDTIME
(precmd), takže budete moci najít přibližnou dobu běhu. Nebo můžete definovat accept-line
funkci tak, že předřadí time
před každým příkazem.
AKTUALIZACE :Toto je kód, který bude ukládat uplynulé časy do $_elapsed
pole:
preexec () {
(( $#_elapsed > 1000 )) && set -A _elapsed $_elapsed[-1000,-1]
typeset -ig _start=SECONDS
}
precmd() { set -A _elapsed $_elapsed $(( SECONDS-_start )) }
Pak pokud spustíte sleep 10s
:
% set -A _elapsed # Clear the times
% sleep 10s
% sleep 2s ; echo $_elapsed[-1]
10
% echo $_elapsed
0 10 0
Není potřeba ve čtyřech proměnných. Žádné problémy se jmény nebo další zpoždění. Všimněte si, že $_elapsed
pole se může velmi zvětšit, takže musíte odstranit první položky (to se provádí pomocí následující části kódu:(( $#_elapsed > 1000 )) && set -A _elapsed $_elapsed[-1000,-1]
).
AKTUALIZACE 2 :Nalezen skript pro podporu precmd a preexec ve stylu zsh v bash. Možná budete muset odstranit typeset -ig
(Použil jsem jen k vynucení $_start
být celé číslo) a nahradit set -A var ...
s var=( ... )
aby to fungovalo. A já nevím, jak rozdělit pole a získat jejich délku v bash.
Skript:http://www.twistedmatrix.com/users/glyph/preexec.bash.txt
AKTUALIZACE 3 :Nalezen jeden problém:pokud stisknete return s prázdným řádkem, preexec se nespustí, zatímco precmd ano, takže v $_elapsed
získáte nesmyslné hodnoty pole. Chcete-li to opravit, nahraďte precmd
funkci s následujícím kódem:
precmd () {
(( _start >= 0 )) && set -A _elapsed $_elapsed $(( SECONDS-_start ))
_start=-1
}
Svět se možná trochu posunul od doby, kdy na tyto otázky odpověděli ostatní.
zsh
má některé vestavěné funkce pro měření času, jak dlouho příkazy trvají.
Pokud povolíte možnost inc_append_history_time pomocí
setopt inc_append_history_time
Poté se čas potřebný ke spuštění každého příkazu uloží do vaší historie a poté jej lze zobrazit pomocí history -D
.
Struktura této odpovědi:
- Neexistuje žádný předem připravený způsob, jak načasovat příkaz, který již byl spuštěn
- Existují způsoby, jak odvodit odhad doby trvání příkazu.
- Je zobrazen důkaz konceptu (počínaje hypotézou, že to nelze provést, a končící závěrem, že hypotéza byla chybná).
- Existují hacky, které můžete zavést předem a které zaznamenají uplynulý čas každého příkazu, který spustíte
- Závěr
Odpověď označená částmi podle výše uvedeného obrysu:
Část 1 - krátká odpověď je "ne"
Ne Promiň. Musíte použít time
.
Část 2 - možná si můžete odvodit výsledek
V některých případech, pokud program zapisuje výstupní soubory nebo informace do souborů protokolu, můžete být schopni odvodit dobu běhu, ale to by bylo specifické pro program a pouze odhad. Pokud máte v Bash nastaven HISTTIMEFORMAT, můžete se podívat na záznamy v souboru historie, abyste získali představu o tom, kdy se program spustil. Čas ukončení se však nezaznamenává, takže dobu trvání můžete odvodit pouze v případě, že byl jiný program spuštěn bezprostředně poté, co skončil ten, který vás zajímá.
Část 3 - hypotéza je zfalšovaná
Hypotéza :Doba nečinnosti se bude počítat do uplynulého času
Zde je příklad pro ilustraci mého názoru. Je založeno na návrhu od ZyX , ale bylo by to podobné pomocí jiných metod.
V zsh
:
% precmd() { prevstart=start; start=$SECONDS; }
% preexec() { prevend=$end; end=$SECONDS; }
% echo "T: $SECONDS ps: $prevstart pe: $prevend s: $start e: $end"
T: 1491 ps: 1456 pe: 1458 s: 1459 e: 1491
Nyní počkáme... řekněme 15 sekund, pak:
% echo "T: $SECONDS"; sleep 10
T: 1506
Nyní počkáme... řekněme 20 sekund, pak:
% echo "T: $SECONDS ps: $prevstart pe: $prevend s: $start e: $end"
T: 1536 ps: 1492 pe: 1506 s: 1516 e: 1536
Jak vidíte, mýlil jsem se . Čas zahájení (1516) mínus předchozí čas ukončení (1506) je dobu trvání příkazu (sleep 10
).
Hypotéza zfalšovaná - je možné získat správný uplynulý čas bez zahrnutí doby nečinnosti
Část 4 - hack pro záznam uplynulého času každého příkaz
Zde jsou ekvivalenty Bash k funkcím v ZyX odpověď (vyžadují skript, na který je odkaz):
preexec () {
(( ${#_elapsed[@]} > 1000 )) && _elapsed=(${_elapsed[@]: -1000})
_start=$SECONDS
}
precmd () {
(( _start >= 0 )) && _elapsed+=($(( SECONDS-_start )))
_start=-1
}
Po instalaci preexec.bash
(z propojeného skriptu) a vytvoření dvou výše uvedených funkcí by příklad spuštění vypadal takto:
$ _elapsed=() # Clear the times
$ sleep 10s
$ sleep 2s ; echo ${_elapsed[@]: -1}
10
$ echo ${_elapsed[@]}
0 10 2
Část 5 - závěr
Použijte time
.