В bash, при запуске с -x
опцией, возможно ли исключить отображение отдельных команд?
Я пытаюсь сделать вывод настолько аккуратным, насколько это возможно, поэтому я запускаю определенные части моего скрипта в подоболочке set +x
. Тем не менее, сама строка set +x
все еще отображается и не добавляет никакой ценной информации к выводу.
Я помню, что в старые добрые .bat
времена, когда работали с echo on
, отдельные строки можно было освободить, начав их с @
. Есть ли какой-нибудь эквивалент в bash?
#!/bin/bash -x
function i_know_what_this_does() {
(
set +x
echo do stuff
)
}
echo the next-next line still echoes 'set +x', is that avoidable?
i_know_what_this_does
echo and we are back and echoing is back on
При выполнении вышеизложенного вывод:
+ echo the next-next line still echoes 'set +x,' is that 'avoidable?'
the next-next line still echoes set +x, is that avoidable?
+ i_know_what_this_does
+ set +x
do stuff
+ echo and we are back and echoing is back on
and we are back and echoing is back on
Причина, по
set +x
которой выводится это то, чтоset -x
означает «напечатать команду, которую вы собираетесь запустить, с расширениями, перед ее запуском . Таким образом, оболочка не знает, что вы хотите, чтобы она не печатала данные до тех пор, пока не напечатает строку, сообщающую об этом не печатать вещи. Насколько я знаю, нет никакого способа остановить это.источник
Вот решение, которое вы искали:
Исходная команда выполняется в той же оболочке при преобразовании идентичности. Непосредственно перед запуском вы получаете нерекурсивное выражение аргументов. Это позволяет вам извлекать команды, о которых вы заботитесь, без spamming stederr с дубликатами каждой команды "echo".
источник
perl
(и проблем с многострочными командами):+() { :;} 2> /dev/null; xtrace() { (PS4=; set -x; + "$@";{ set +x; } 2> /dev/null); "$@";}
set -x
Маневры покупают мне что-нибудь по сравнению с простоprintf >&2 '+ %s\n' "$*"
?xtrace() { printf >&2 '+ %s\n' "$*"; "$@"; }