Gibt es eine einfache Möglichkeit, alle Aktivitäten eines Shell-Skripts zu protokollieren?

18

Gibt es eine einfache Möglichkeit, alle Aktivitäten eines Shell-Skripts in einer Datei zu protokollieren?

Ich habe ein Drehbuch. Es gibt Dinge wie Echo "Anweisungen" sowie andere Programmausgaben aus. Ich kenne die Befehle:

command | tee -a "$log_file"

und

command >> logifle.log

Was ich frage, ist, ob es einen Shell-Parameter für die Protokollierung oder einen Set-Befehl gibt, den ich verwenden kann, oder so ähnlich. Ich möchte nicht unbedingt Dutzende von Weiterleitungen oder Abschlägen zu Dateien hinzufügen, wenn ich das nicht muss. Ich möchte dennoch eine Standardausgabe erhalten - ich möchte nur, dass sie protokolliert wird.:wq

j0h
quelle
5
LOL,: wq wie ich war in vim '
j0h
1
Es verwirrt mich, dass die meisten Leute das zu tun scheinen, anstatt: x
Entschuldige

Antworten:

18

Wenn Sie Ihr Skript normalerweise mit ausführen foo.sh, versuchen Sie, es mit auszuführen (vorausgesetzt, es ist ein Bash-Skript) bash -x foo.sh. Wenn Sie möchten, dass alles in eine Datei umgeleitet wird, versuchen Sie es bash -x foo.sh > file.log 2>&1(beachten Sie, dass ich auch stderr umleite, und entfernen 2>&1Sie das Kontrollkästchen, wenn Sie dies nicht möchten). Wenn Sie auch wollen , um zu sehen , was los ist , bash -x foo.sh 2>&1 | tee log.file.

Roadmr
quelle
20

Es gibt einen sehr einfachen und praktischen Weg:

Mit können Sie scriptein Typoskript für die Terminalsitzung erstellen

  1. Starten Sie den Befehl script

    Wenn das Argument filegegeben ist, zum Beispiel script ~/tmp/output, scriptspeichert den Dialog in dieser Datei. Wird kein Dateiname angegeben, wird der Dialog in der Datei gespeicherttypescript

  2. Starten Sie Ihr Skript oder was auch immer Sie starten möchten

  3. Wenn Ihr Skript fertig ist, stoppen Sie scriptüber Ctrl-D

  4. Überprüfen Sie die Ausgabe in der Standardausgabedatei typescript


scriptVerwenden Sie den Parameter, um Ihren Befehl in einem Schritt mit zu starten-c

-c COMMAND
    Run the COMMAND rather than an interactive 
    shell. This makes it easy for a script to capture
    the output of a program that behaves differently
    when its stdout is not a tty.

Die Verwendung scriptin Ihrem Skript macht keinen Sinn, da scriptdie Shell gegabelt oder eine neue Shell gestartet wird.

Wenn die Variable SHELL existiert, ist die vom Skript gegabelte Shell diese Shell. Wenn SHELL nicht festgelegt ist, wird die Bourne-Shell angenommen. (Die meisten Shells setzen diese Variable automatisch).

AB
quelle
4
@ Fabby Ich mag meine Antwort, aber ich sehe das kleine graue Ding nicht;)
AB
Ich benutze script logfilename, damit ich es auswählen kann.
Waltinator
kann ich "script" von meinem Shell-Programm aus aufrufen?
30.
1
Das macht keinen Sinn, siehe meine verbesserte Antwort.
AB
1
+1. Danke für diese Antwort :-) scriptNützlich ist auch eine Überwachung über ein Fifo. Von man script: " -f, --flushAusgabe nach jedem Schreibvorgang spülen. Dies ist für die Telekooperation hilfreich: Eine Person mkfifo foo; script -f fooüberwacht in Echtzeit, was mit cat foo" getan wird . Es kann auch verwendet werden, um zu überwachen, wann ein Programm auf eine Eingabe wartet, oder beispielsweise durch Überwachen des Zeitstempels des FIFO.
Sudodus