Roteiro
#!/bin/bash
set -v
echo "verbose echo"
{ set +v; } &>/dev/null
echo "non verbose echo"
fornece a seguinte saída:
echo "verbose echo"
verbose echo
{ set +v; } &>/dev/null
non verbose echo
Quero suprimir a saída { set +v; } &>/dev/null
e obter a seguinte saída:
echo "verbose echo"
verbose echo
non verbose echo
Eu tentei a abordagem acima descrita aqui para suprimir a saída para desabilitar o sinalizador xtrace
( x
) com o comando { set +x; } &>/dev/null
e está funcionando para este xtrace
sinalizador. Não encontrei informações relacionadas nos manuais de bash
e set
.
Como solução alternativa, isso pode ser alcançado por meio de uma chamada de subshell, como mostrado aqui . Mas isso é possível sem usar subshell?
A descrição POSIX de set(1p) afirma:
Como o comando para redirecionar stdout/stderr do próximo comando constitui uma "entrada" para o shell, infelizmente não é possível redefinir a
v
opção sem pelo menos gerar o comando que redireciona o próprio stderr (ou usarset -v
em um subshell), ou seja:dá:
Embora cumpra os requisitos de que subshells não sejam usados e a invocação do set(1p) em si não seja gerada, esse tipo de redirecionamento tem a desvantagem de que a saída subsequente para stderr também será redirecionada para /dev/null, a menos que seja redirecionada novamente, para stdin ou tal.
A
x
opção set(1p) é um caso especial. É importante notar que o POSIX afirma o seguinte:enquanto o Manual do GNU Bash afirma:
Além disso, com a substituição de
&>
by2>
, dash (um shell cujo objetivo de design é estrita conformidade com POSIX) segue esse comportamento do Bash e suprime a saída de{ set +x; } 2>/dev/null
, enquanto, por exemplo , mksh não: