Erfassen Sie die gesamte Ausgabe eines Skripts in einer Datei (aus dem Skript selbst) [duplizieren]

Diese Frage hat hier bereits Antworten :

Kommentare

  • Für diejenigen, die hier von Google landen, können Sie auch diese Antwort in Betracht ziehen ( unix.stackexchange.com/a/164017/103505 ), um einfach den gesamten Code einzugeben Sie möchten in einer Funktion im Skript ausgeben und dann die Ausgabe dieser Funktion umleiten.

Antwort

Eine Methode, die ich gefunden habe, um alle Ausgaben einer Sitzung zu erfassen, besteht darin, eine neue Bash-Sitzung zu starten und eine Protokolldatei abzurufen. Es ist wirklich nützlich, um mehr als nur ein Skript zu verfolgen.

 bash | tee ~/bash.log #this will save standard output until the bash session is ended bash | tee ~/bash.log 2>&1 #this will save all output including errors until the bash session is ended 

oder Sie können das Skript einfach selbst abschlagen

./myscript.sh | tee ./myscript.log #this will log only the output of the script.

Kommentare

  • Ihre Lösung adressiert STDOUT, aber nicht STDERR
  • Ich habe ein Beispiel mit
  • Ich glaube nicht, dass dies die Frage beantwortet, da die Anforderung Nr. 1 " ausgeführt wurde.
    = 798b5d58b7 „>

    ./myscript.sh ohne zusätzliche Shell-Konstrukte ".

  • Diese Frage wurde vor 6 Stunden bearbeitet, ich habe ' habe diese Informationen nicht, als ich die Frage zum ersten Mal beantwortete. Es wurde die Ausgabe > anstelle von tee verwendet, und deshalb habe ich die Option für tee geteilt.

Antwort

Sie können script innerhalb eines Skripts jederzeit aufrufen Alles protokollieren.

Zum gleichzeitigen Drucken und Protokollieren in einem Bash-Skript an log.txt:

Anzeigen des Protokolls log.txt:

$ ./a.sh Script started, output file is log.txt teste Script done, output file is log.txt $ cat log.txt Script started on Fri Feb 16 17:57:26 2018 command: /bin/bash -c ./a.sh teste Script done on Fri Feb 16 17:57:26 2018 

Kommentare

  • Wenn ich das richtig verstehe (einige Erklärungen würden helfen :), versucht das Skript festzustellen, ob ' unter script und nicht selbst erneut ausführen. Ab Ubuntu 20 scheint $SCRIPT nicht festgelegt zu sein, daher geht das Skript in eine Endlosschleife.
  • Gute Idee, , da es eine interaktive Terminalausgabe ermöglicht, z Wagenrücklauf zur Arbeit. Tatsächlich verhalten sich Befehle, die eine einzeilige Fortschrittsausgabe anzeigen (z. B. Archivierer), , normal . Zur Lösung des Endlosschleifenproblems können wir die Shell-Ebene testen : if (( $SHLVL < 3 )); then script...; fi.
  • Außerdem werden die Argumente der Skripte verkettet und im Argument code an die Shell übergeben, die von script (nicht , dieses /bin/bash Argument wird mit util-linux ignoriert script)

Antwort

Sie möchten tee verwenden.

Beispiel:

echo "Hello World" | tee out.txt 

Dadurch wird eine Datei out.txt mit der Ausgabe des Befehls erstellt und auf dem Bildschirm gedruckt. Verwenden Sie „tee -a Dateiname“, wenn Sie an die Datei anhängen möchten.

echo "Hello" | tee -a out.txt echo "World" | tee -a out.txt 

out.txt hat zwei Zeilen Hello und World (ohne -a) hätte nur Welt)

Wenn Sie das gesamte Skript speichern und das gesamte Skript ausgeben möchten:

./script.sh | tee output.txt 

Kommentare

  • Ihre Lösung adressiert STDOUT, aber nicht STDERR
  • unix.stackexchange.com/a/61932/268823 erklärt, wie STDOUT und STDERR ausgeführt werden
  • Ich glaube nicht, dass dies die Frage beantwortet, da Anforderung Nr. 1 " Führen Sie ./myscript.sh ohne zusätzliche Shell-Konstrukte aus. ".
  • Ich denke, eine Möglichkeit wäre dies um alles in eine Funktion zu bringen und am Ende Tee zu verwenden. Das würde effektiv als Start- und Stopp-Erfassung funktionieren. Und den STDERR umleiten, wenn dies beabsichtigt ist.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.