Dane wyjściowe z -x są przesyłane do stderr, a nie do standardowego. Ale nawet to może stanowić problem - wiele skryptów będzie miało funkcjonalne zależności od zawartości stderr, a jego bałaganem jest mieszanie strumieni debugowania i stderr w niektórych przypadkach.
Wersje Bash> 4.1 oferują inne rozwiązanie: zmienna środowiskowa BASH_XTRACEFD umożliwia określenie deskryptora pliku, który będzie używany do wysyłania strumienia debugowania. Może to być plik lub potok lub dowolna inna dobroć uniksowa.
# 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
Przy odrobinie kręcenia możesz robić inne rzeczy - na przykład robić tee na strumieniach stdout i / lub stdin oraz przeplatać je z wyjściem debugowania, aby Twój dziennik był bardziej kompletny. Aby uzyskać więcej informacji na ten temat, zobacz /programming/3173131/redirect-copy-of-stdout-to-log-file-from-within-bash-script-itself .
Dużą zaletą tego podejścia w porównaniu z alternatywami jest to, że nie ryzykujesz zmian w zachowaniu twojego skryptu poprzez wstrzykiwanie wyników debugowania do stdout lub stderr.
exec 19>&-
)? Z mojego doświadczenia wynika, że jest on zamykany automatycznie po zakończeniu skryptu.set -x
nie wysyła niczego na standardowe wyjście, więc nie ma problemu. Co ona ma zrobić, to napisz do błędu standardowego, który jedzie do konsoli domyślnie.To, co chcesz zrobić, to przekierować standardowe wyjście do innego pliku, takiego jak ten:
źródło
Zobaczyć
man tee
.Uruchamiasz go tak
tee commandname filename
, aby wyświetlał dane wyjściowe poleceństdout
i zapisywał je równieżfilename
.źródło