Direkte Ausgabe von einem Befehl in eine Datei, die den ursprünglichen Befehl enthält, UND im Terminal drucken

8

Wenn ich einige Tests durchführe, muss ich eine Reihe von Befehlen ausführen. Es wäre sehr nützlich für mich und würde mir eine Menge Zeit ersparen, wenn es einen Weg gäbe, all diese Dinge zu tun:

  • Führen Sie den Befehl aus, den ich ausführen muss
  • Leitet die gesamte Ausgabe des Befehls an eine angegebene Datei um
  • Fügen Sie den ursprünglichen Befehl in die angegebene Datei
  • ein
  • Gibt die Ausgabe des ursprünglichen Befehls im Terminal aus

Die Leute haben vorgeschlagen, mir ein T-Shirt zu geben, das sowohl auf Terminal drucken als auch in eine Datei senden kann, aber nicht den ursprünglichen Befehl enthält. Am Ende möchte ich eine Datei, in der die erste Zeile der Befehl ist, den ich ausgeführt habe, und darunter die Ausgabe des Befehls.

Jemand hat das vorgeschlagen:

echo "ls -l" | xargs -I{} bash -c "echo >> output.file; eval {} >> output.file"

Aber dies druckt weder die Ausgabe im Terminal noch den Originalbefehl in die Datei.

Ich würde mich über irgendwelche Ideen freuen.

    
shaneoh 28.11.2017, 10:13

3 Antworten

13

Das ist tee , nach dem Sie suchen.

ls -l | tee outfile

druckt die Ausgabe von ls -l auf stdout (d. h. das Terminal) und speichert sie gleichzeitig in der Datei outfile . Aber : Es schreibt den Befehlsnamen weder in stdout noch in die Datei. Um dies zu erreichen, setzen Sie% echo auf den Befehlsnamen, bevor Sie den Befehl ausführen, und leiten Sie beide Ausgaben an tee :

( echo "ls -l" && ls -l ) | tee outfile

Das ist mühsam zu schreiben, also warum nicht eine Funktion definieren?

both(){ ( echo "" &&  ) | tee outfile ;}

Danach können Sie einfach

ausführen
both "ls -l"

um das gewünschte Ergebnis zu erhalten. Setzen Sie die Funktion in Ihr ~/.bashrc , damit sie in jedem neuen Terminal definiert wird. Ersetzen Sie outfile durch , um die Ausgabedatei mit z. both "ls -l" output , anstatt jedes Mal in outfile zu schreiben. Wenn Sie nicht möchten, dass die Ausgabedatei überschrieben wird, sondern an sie angehängt wird, fügen Sie die Option -a zu tee hinzu.

    
dessert 28.11.2017, 10:30
8

Sie können den Befehl script verwenden, der eine Typoskript-Datei von allem erstellt, das auf Ihrem Terminal gedruckt wird. Es erzeugt eine gegabelte Shell und zeichnet alles auf, bis diese Shell beendet wird.

$ script my_output
Script started on Tue 28 Nov 2017 09:46:15 AM UTC
$ whoami
ajefferiss
$ exit
Script done on Tue 28 Nov 2017 09:46:27 AM UTC

Dann wenn ich cat my_output bekomme ich die gleiche Ausgabe:

$ cat my_output
Script started on Tue 28 Nov 2017 09:46:15 AM UTC
$ whoami
ajefferiss
$ exit
exit

Script done on Tue 28 Nov 2017 09:46:27 AM UTC
    
AJefferiss 28.11.2017 10:49
5

Sie können die Debugging-Funktion der Shell zusammen mit tee :

verwenden
( set -x; command1 args...; command2 args ) 2>&1 | tee output.log
  • ( ... ) startet eine Subshell, mit der Sie die Ausgabeströme aller Befehle, die in der Subshell ausgeführt werden, "sammeln" können. Es enthält außerdem den Effekt des Befehls set auf diese Untershell.

  • set -x aktiviert die Shelloption x , die alle Befehle ausgibt, die von der Shell ausgeführt werden, bevor sie ausgeführt werden.

  • 2>&1 leitet Stream 2 (Standardfehler) zu Stream 1 (Standardausgabe) um.

  • | leitet den Standard-Ausgabestream des linken Befehls an den Standard-Eingabestream des rechten Befehls um.

  • tee FILE kopiert den Standard-Eingabestream in die Datei FILE und in die Standardausgabe.

Wenn sich Ihre Befehlssequenz bereits in einer Skriptdatei befindet, wäre es sinnvoller, sie wie folgt auszuführen:

bash -x /path/to/script args... 2>&1 | tee output.log
    
David Foerster 28.11.2017 13:53

Tags und Links