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 ignoriertscript
)
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.