Вывод xtrace
идет в stderr до оценки команды, включая перенаправления.
Так в:
set -x # or set -o xtrace
echo test 2> file
Команда + echo test
идет туда, куда шел stderr, затем оболочка открывает файл
на fd 2 и затем запускает echo test
. Если вы хотите, чтобы + echo test
отправился в file
, вам нужно:
{ echo test; } 2> file
В этот раз перенаправление выполняется для группы команд, а затем оценивается команда echo test
(и + echo test
записывается в stderr, который в этот момент отправляется в file
).
Обратите внимание, что некоторые оболочки, такие как AT&T ksh
, также будут выводить + 2> file
. Это также ошибочно в некоторых версиях mksh
.
Это также означает, что stderr любой команды, запущенной внутри этой группы команд, будет идти в файл
. Чтобы обойти это, вам нужно:
set -x
{
cmd 2>&3 3>&-
} 3>&2 2> file
То есть сохранить копию оригинального stderr (на fd 3) и восстановить его для команд внутри группы команд.
В bash
альтернативой является использование специальной переменной $BASH_XTRACEFD
:
exec 7> file
BASH_XTRACEFD=7
set -x
echo test
Если вам нужен красивый xtrace
вывод, попробуйте zsh
. Также обратите внимание, что его можно настроить с помощью специальной переменной $PS4
.
Включение Always trust keys in my keyring for encrypting
решило проблему для меня.