Mám příkaz klíčového slova bash time, který nedokážu plně vysvětlit, ale funguje mi.
Můj cíl:
-
najít dobu provádění nějakého python skriptu, který bere proměnnou btw, ze skriptu bash a zachytit tuto hodnotu.
-
také k zachycení výstupu python skriptu ve stejné proměnné, pro analýzu úspěchu nebo selhání.
Po přečtení jsem skončil u tohoto příkazu, ale nejsem schopen jej plně vysvětlit.
ttime=$( (TIMEFORMAT="%U^"; time /../myscript.py ${__myvar} 2>&1 )|& tr -d f)
Můžete vysvětlit, proč potřebuji druhý příkaz tr -d f
v rouře, aby se hodnota času připojila k výstupu příkazu,
Volba 'tr -d f' byla zcela libovolná a neovlivní výstup mého skriptu, std nebo err, ale bez něj nebo jiného příkazu, který nějakým menším způsobem působí na textový výstup skriptů, vidím návrat z python bez připojeného času, proč?
Upravit:
Skutečná otázka měla znít, proč je |& tr -d f
. potřeba, a jak říká Stephanie, je to |&, které umožňuje předání časování nalezeného v klíčovém slově sterr z klíčového slova time do výstupu potrubí
Řešení nyní vypadá takto:
ttime=$(TIMEFORMAT="%U^"; { time /../myscript.py ${__myvar} ; } 2>&1 )
Kurz deskriptoru pole:
http://wiki.bash-hackers.org/howto/redirection_tutorial
Přijatá odpověď:
V bash
, jako v ksh
, time
je klíčové slovo (ne vestavěný), který se používá k časování potrubí (nejen jednoduchý příkaz, dokáže časovat i složené příkazy).
V time cmd 2> something
, cmd 2> something
a tisk výstupu do stderr, ale do původního stderr.
Musíte přesměrovat stderr před time
konstrukt je vyvolán. Což uděláte pomocí |&
který přesměruje stdout a stderr podshell time
je spuštěn, ale mnohem jednodušší způsob, jak to udělat, by byl:
time=$(TIMEFORMAT="%U^"; { time cmd; } 2>&1)
To nezahrnuje subshell (zde používáme skupinu příkazů místo toho) ani další příkaz.
Všimněte si, že pomocí bash
:
time=$(time (cmd) 2>&1)
pracuje náhodou. Na to bych nespoléhal, protože se to může v budoucích verzích změnit a nefunguje to v jiných shellech, které mají time
klíčové slovo.
Pokud byste chtěli pouze výstup časování v $time
(a ne stdout nebo stderr příkazu), udělali byste:
{ time=$(TIMEFORMAT="%U^"; { time cmd 2>&3 3>&-; } 2>&1); } 3>&1