GNU/Linux >> Znalost Linux >  >> Linux

Výsledek klíčového slova Bash Time pouze s příkazem Second Piped, vysvětlete proč?

Mám příkaz klíčového slova bash time, který nedokážu plně vysvětlit, ale funguje mi.

Můj cíl:

  1. najít dobu provádění nějakého python skriptu, který bere proměnnou btw, ze skriptu bash a zachytit tuto hodnotu.

  2. 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

Linux
  1. Proč je nastavení proměnné před příkazem v Bash legální?

  2. Příkaz Rm ve skriptu Bash nefunguje s proměnnou?

  3. Zkontrolujte, jak dlouho trvá spuštění Bash skriptu s Time Command

  1. příkaz bash watch se zachovanými barvami

  2. Proč spouštět příkaz prostředí Linux s '&'?

  3. Proč slabtop -o vrací pouze prvních 23 řádků, když je příkaz rourou?

  1. Naplánujte si úlohu pomocí příkazu Linux at

  2. Propojené příkazy s ovládacími operátory v Bash

  3. Linux time Command Tutorial pro začátečníky (s příklady)