No bash, ao executar com a -x
opção, é possível isentar comandos individuais do eco?
Estou tentando tornar a saída o mais organizada possível, por isso estou executando certas partes do meu script em um subshell com set +x
. No entanto, a set +x
própria linha ainda é ecoada e não adiciona informações valiosas à saída.
Lembro-me de antigamente .bat
, quando corríamos com echo on
, linhas individuais podiam ser isentas iniciando-as com a @
. Existe algum equivalente no 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
Ao executar o acima, a saída é:
+ 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
A razão
set +x
impressa é queset -x
significa "imprima o comando que você está prestes a executar, com expansões, antes de executá-lo . Portanto, o shell não sabe que você deseja que ele não imprima coisas até depois de imprimir a linha, dizendo que não para imprimir as coisas.De acordo com o meu conhecimento, não há como impedir que isso aconteça.fonte
Aqui está a solução que você está procurando:
O comando original é executado no mesmo shell em uma transformação de identidade. Antes da execução, você obtém um xtrace não recursivo dos argumentos. Isso permite rastrear os comandos de que você gosta sem enviar spam ao stederr com cópias duplicadas de cada comando "eco".
fonte
perl
(e problemas com comandos de várias linhas):+() { :;} 2> /dev/null; xtrace() { (PS4=; set -x; + "$@";{ set +x; } 2> /dev/null); "$@";}
set -x
manobras me compram algo comparado a apenasprintf >&2 '+ %s\n' "$*"
?xtrace() { printf >&2 '+ %s\n' "$*"; "$@"; }