перенаправление скриптовой переменной в файл журнала без потери stderr

При установке «set -x» внутри сценария bash, или если вы запустите свой скрипт с помощью bash -x , вы получите все аргументы, напечатанные на экране вместе со стандартным.

Возможно ли, чтобы stderr и stdout были напечатаны на экране, но перенаправляя set -x вывод в файл журнала, не распечатывая его на экране?

Идея состоит в том, чтобы иметь всю информацию, которую я могу получить внутри журнала, но только печатать стандартные stdout и stderr на экране.

 user1@mac1:~/tmp$ cat t1.sh exec 4>shell.log BASH_XTRACEFD=4 set -x echo abc cat ffff user1@mac1:~/tmp$ bash t1.sh abc cat: ffff: No such file or directory user1@mac1:~/tmp$ cat shell.log + echo abc + cat ffff user1@mac1:~/tmp$ 

Вывод set -x выводится на stderr . Что вам нужно сделать, это перенаправить stderr , например:

 sh -x your_script.sh 2> debug_info.txt 

Если вы хотите отличить вывод stderr из-за set -x из обычного вывода stderr , вы можете использовать тот факт, что set -x выводится префикс $PS4 , который по умолчанию равен + .

 bash -x your_script.bash 2> \ \ >(tee >/dev/null \ >(grep '^\+ ' > set_x_output.txt)\ >(grep -v '^\+ ' > rest_of_sdterr.txt)\ ) 

Если часть вашего нормального вывода stderr начинается с + , вы можете изменить префикс по умолчанию, изменив PS4 .

мне удалось исправить мое перенаправление с помощью этой команды:

  • его также позволяет мне точно контролировать то, что я исключаю.
  • это только для версии bash старше, чем 4.1, где BASH_XTRACEFD недействителен.

exec 2> >(tee -a $LOG_FULL_NAME 2>&1 | grep -v "^+ \|^++ ") 1>&2