У меня есть определенные критические сценарии удара, которые вызываются кодом, которым я не управляю, и где я не вижу их консольного вывода. Я хочу полную трассировку того, что эти сценарии сделали для более позднего анализа. Чтобы сделать это, я хочу сделать каждую самотрассировку сценария. Вот то, что я в настоящее время делаю:
#!/bin/bash
# if last arg is not '_worker_', relaunch with stdout and stderr
# redirected to my log file...
if [[ "$BASH_ARGV" != "_worker_" ]]; then
$0 "$@" _worker_ >>/some_log_file 2>&1 # add tee if console output wanted
exit $?
fi
# rest of script follows...
Существует ли лучший, более чистый способ сделать это?
#!/bin/bash
exec >>log_file 2>&1
echo Hello world
date
exec
имеет волшебное поведение в отношении перенаправления: «Если команда не указана, любые перенаправления вступают в силу в текущей оболочке , а статус возврата - 0. Если есть ошибка перенаправления, статус возврата - 1. »
Также, что касается вашего исходного решения, exec« $ 0 »
лучше, чем « $ 0. "; exit $?
, потому что первый не оставляет дополнительный процесс оболочки до тех пор, пока подпроцесс не завершится.