Как descibed в http://mywiki.wooledge.org/BashFAQ/106, вы можете применить глобальное перенаправление для всех команд.
Таким образом, вы можете начать свой скрипт так:
exec 3>&1 >log 2>&1
С помощью этой команды, новый FD 3 будет присвоен экран, существовавший fd1 будет отправлена в лог-файл и STDERR также будут отправлены в лог-файл ,
Дайте ему попробовать (или проверить мой тест here)
exec 3>&1 >log 2>&1
ls nofile #This will raise an error on stderr
echo "hello" #This would normally be printed on stdout/fd1
echo "hello again" >&3 #This will go in fd3
#Output:
hello again
$ cat log
ls: cannot access nofile: No such file or directory
hello
низкоспиновое провалится (если у вас есть файл с именем «nofile» :)), но сообщение об ошибке будет отправлено войти Gilė.
Эхо удастся распечатать «привет», но это перейдет к fd1, что снова означает файл журнала.
Последнее эхо перенаправляется на fd3 = ваш реальный экран, и это единственное сообщение, которое вы увидите в реальности.
На один шаг вперед вы можете захватить каждый результат команды с помощью $? (или используя массив bash PIPESTATUS, если вы собираетесь использовать каналы).
Другой тест:
exec 3>&1 >log 2>&1
ls nofile; ex=$?;
[[ "$ex" -ne 0 ]] && (echo "Oops, something gone wrong.Exit status = $ex" && cat log) >&3
#Output
Oops, something gone wrong.Exit status = 2
ls: cannot access nofile: No such file or directory
Альтернативный способ
if ! ls nofile;then echo "something is wrong" >&3;fi
Если Ls выходит из строя, будет печатать «что-то не так» на экране
если Ls не обязательно будет печатать это результаты войти и вы ничего не видите на экране.
В качестве общей идеи с таким методом вы можете всегда перенаправлять stderr и stdout в файл, и вы можете выбирать, чтобы печатать сообщения на экране, применяя >&3
в каждой команде, которую вы хотите, чтобы ее результаты были напечатаны на вашем экран.
Я не знаю, возможно ли автоматическое перенаправление на основе статуса выхода каждой команды. Это то, что используется stderr. Чтобы печатать ошибки.
Кажется, что вам нужно контролировать статус выхода каждой команды после ее выполнения.
Кроме того, обратите внимание, что некоторые команды могут вернуть статус выхода, отличный от нуля на основе выполняемой операции (т.е. команда дифф)
Это не появляется на работе, он не должен ничего об успехе печати: '○ echo "real_file_text"> real_file.txt' '○ cat real_file.txt> /tmp/out.txt 2> & 1 || echo $? && cat/tmp/out.txt' output: 'real_file_text' –
Теперь я понял лучше. Тогда это должно сделать трюк: ls real_file.txt> /tmp/out.txt 2> & 1 || (echo $? && cat /tmp/out.txt) – arnaldocan