Alguém sabe se podemos dizer set +x
em bash sem que seja impresso:
set -x
command
set +x
vestígios
+ command
+ set +x
mas deve apenas imprimir
+ command
O Bash é a versão 4.1.10 (4). Isso está me incomodando há algum tempo - a saída está cheia de set +x
linhas inúteis , tornando o rastreio não tão útil quanto poderia ser.
script.sh 2>&1 | grep -v 'set +x'
Respostas:
Eu tive o mesmo problema e consegui encontrar uma solução que não usa um subshell:
fonte
set +x
é um comando tão bem-sucedidocommand
, essa variação é uma solução:{ STATUS=$?; set +x; } 2>/dev/null
. Em seguida, inspecione$STATUS
nas linhas subsequentes em seu lazer.{ set +x; } 2>&-
. Isso fecha fd 2 completamente em vez de apontar para / dev / null. Alguns programas não lidam bem com isso quando tentam imprimir em stderr, e é por isso que / dev / null é um bom estilo em geral; mas oset -x
rastreamento da concha lida com isso muito bem, então funciona perfeitamente aqui, e torna este encantamento um pouco mais curto.Você pode usar um subshell. Ao sair do subshell, a configuração para
x
será perdida:fonte
( set -x \n command \n )
é pior do queset -x \n command \n set +x
.cd
: não muda o diretório atual no shell pai.Eu criei uma solução para isso recentemente, quando fiquei irritado com isso:
Isso permite que você habilite e desabilite o xtrace como a seguir, onde estou registrando como os argumentos são atribuídos às variáveis:
E você obtém uma saída semelhante a:
fonte
/dev/stdin
parte). A ressalva é que ativar a expansão de alias em scripts pode ter efeitos colaterais indesejados./dev/stdin
. Não estou ciente de nenhum efeito colateral específico, uma vez que o ambiente não interativo não deve carregar nenhum arquivo que defina aliases. Que efeitos colaterais podem ocorrer?set +x
é muito mais difícil (senão impossível) de se comprometer. Mas ainda é uma solução boa e direta - provavelmente a melhor até agora.Que tal uma solução baseada em uma versão simplificada de @ user108471:
fonte
function () { set_plus_x='{ set +x; } 2>/dev/null' }
Esta é uma combinação de algumas idéias que podem incluir um bloco de código e preserva o status de saída.
Quando executado:
fonte
()
voltaexit
não é necessário. Está bem. Talvez isso é paranóico, mas se este código é utilizado, em geral, você tem um vector bom ataque: redefinetrace_on
etrace_off
e código de injetar que lê comandos executados. Se você usar esses "utilitários" sozinhos, será instrutivo, mas se o código for usado com outros, você deve considerar se os benefícios de tais funções não padronizadas superam as desvantagens. Pessoalmente, eu me{ set +x; } 2>/dev/null
conformei com uma vez que essa construção é comumente entendida e também não altera o status de saída.