Die Ausgabe von -x geht an stderr, nicht an stdout. Aber selbst das kann ein Problem sein - viele Skripte werden funktionale Abhängigkeiten vom Inhalt von stderr haben und es ist in manchen Fällen etwas chaotisch, den Debug- und den stderr-Stream miteinander zu mischen.
Bash-Versionen> 4.1 bieten eine andere Lösung: Mit der Umgebungsvariablen BASH_XTRACEFD können Sie einen Dateideskriptor angeben, an den der Debug-Stream gesendet wird. Dies kann eine Datei, eine Pipe oder eine andere Unix-Qualität sein, die Sie mögen.
# Use FD 19 to capture the debug stream caused by "set -x":
exec 19>/tmp/my-script.log
# Tell bash about it (there's nothing special about 19, its arbitrary)
export BASH_XTRACEFD=19
# turn on the debug stream:
set -x
# run some commands:
cd /etc
find
echo "Well, that was fun."
# Close the output:
set +x
exec 19>&-
# See what we got:
cat /tmp/my-script.log
Mit ein bisschen mehr Fummelei können Sie andere Dinge tun - zum Beispiel ein T-Stück auf den stdout- und / oder stdin-Streams machen und diese mit der Debug-Ausgabe verschachteln, damit Ihr Protokoll vollständiger wird. Weitere Informationen hierzu finden Sie unter /programming/3173131/redirect-copy-of-stdout-to-log-file-from-within-bash-script-itself .
Der große Vorteil dieses Ansatzes gegenüber Alternativen besteht darin, dass Sie keine Änderungen am Verhalten Ihres Skripts riskieren, indem Sie die Debug-Ausgabe in stdout oder stderr einfügen.
exec 19>&-
) geschlossen werden? Nach meiner Erfahrung wird es automatisch geschlossen, wenn das Skript beendet ist.set -x
sendet nichts an die Standardausgabe, daher gibt es dort kein Problem. Was sie nicht tun , ist Schreiben auf Standardfehler, die standardmäßig auf die Konsole geht.Was Sie tun möchten, ist stdout in eine andere Datei umzuleiten:
quelle
Sehen
man tee
.Sie führen es wie
tee commandname filename
folgt aus und es werden die Befehle angezeigt, die ausgegeben werden,stdout
und es wird auch in geschriebenfilename
.quelle