GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bash-Time-Keyword-Ergebnis nur mit zweitem Pipe-Befehl, erklären Sie warum?

Ich habe einen Schlüsselwortbefehl für die Bash-Zeit, den ich nicht vollständig erklären kann, aber er funktioniert bei mir.

Mein Ziel:

  1. um die Ausführungszeit eines Python-Skripts zu finden, das übrigens eine Variable aus einem Bash-Skript nimmt, und diesen Wert zu erfassen.

  2. auch zum Erfassen der Ausgabe des Python-Skripts in derselben Variablen für die Erfolgs- oder Fehleranalyse.

Nachdem ich herumgelesen hatte, landete ich bei diesem Befehl, aber ich bin nicht in der Lage, ihn vollständig zu erklären.

ttime=$( (TIMEFORMAT="%U^"; time  /../myscript.py ${__myvar} 2>&1 )|& tr -d f)

Können Sie erklären, warum ich den zweiten Befehl tr -d f benötige in der Pipe, damit der Zeitwert an die Ausgabe des Befehls angehängt wird,

Die Wahl von 'tr -d f' war völlig willkürlich und wirkt sich nicht auf die Ausgabe meines Skripts aus, std oder err, aber ohne es oder einen anderen Befehl, der sich geringfügig auf die Textausgabe des Skripts auswirkt, sehe ich die Rückkehr von Python ohne angehängte Zeit, warum?

Bearbeiten:

Die eigentliche Frage hätte lauten sollen, warum das |& tr -d f ist . benötigt, und wie Stephanie sagt, ist es das |&, das es ermöglicht, dass die im Schlüsselwort sterr gefundenen Timings in die Pipeline-Ausgabe geleitet werden

Die Lösung sieht jetzt so aus:

ttime=$(TIMEFORMAT="%U^"; { time /../myscript.py ${__myvar} ; } 2>&1 )

Tutorial für Felddeskriptoren:

http://wiki.bash-hackers.org/howto/redirection_tutorial

Akzeptierte Antwort:

In bash , wie in ksh , time ist ein Schlüsselwort (nicht eingebaut), das verwendet wird, um eine Pipeline zu timen (nicht nur einfache Befehle, es können auch zusammengesetzte Befehle zeitgesteuert werden).

In time cmd 2> something , wir timen cmd 2> something und die Ausgabe auf stderr ausgeben, aber auf die ursprüngliche stderr.

Sie müssen stderr vorher umleiten die time Konstrukt wird aufgerufen. Was Sie mit Ihrem |& tun das die stdout und stderr der Subshell time umleitet ist eingelaufen, aber ein viel einfacherer Weg wäre:

time=$(TIMEFORMAT="%U^"; { time cmd; } 2>&1)

Das beinhaltet keine Subshell (hier verwenden wir eine Befehlsgruppe stattdessen) noch einen zusätzlichen Befehl.

Beachten Sie das mit bash :

time=$(time (cmd) 2>&1)

funktioniert zufällig. Ich würde mich nicht darauf verlassen, da es sich in zukünftigen Versionen ändern könnte und nicht in anderen Shells funktioniert, die eine time haben Schlüsselwort.

Wenn Sie nur die Timing-Ausgabe in $time wünschen (und nicht stdout oder stderr des Befehls), würden Sie Folgendes tun:

{ time=$(TIMEFORMAT="%U^"; { time cmd 2>&3 3>&-; } 2>&1); } 3>&1

Linux
  1. Planen Sie eine Aufgabe mit dem Linux-Befehl at

  2. Gekoppelte Befehle mit Steueroperatoren in Bash

  3. Informationen mit dem vsish-Befehl abrufen (nur esxi)

  4. '&&' vs. '&' mit dem 'test'-Befehl in Bash

  5. Warum gibt slabtop -o nur die ersten 23 Zeilen zurück, wenn der Befehl weitergeleitet wird?

Bash HereDoc Tutorial mit Beispielen

So führen Sie einen Befehl mit Zeitlimit (Timeout) in Linux aus

Bash Echo-Befehl mit Beispielen in Linux erklärt

Bash-Scripting – Printf-Befehl mit Beispielen erklärt

Zeiterfassung mit Timewarrior auf der Kommandozeile

Führen Sie Befehle mit einem Zeitlimit in Ubuntu 20.04 aus