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 
scriptund nicht selbst erneut ausführen. Ab Ubuntu 20 scheint$SCRIPTnicht 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/bashArgument 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.