Com bash
4.1 e acima, você pode fazer
BASH_XTRACEFD=7 ./script.bash 7> /dev/null
(também funciona quando bash
é invocado como sh
).
Basicamente, estamos dizendo bash
para gerar a saída xtrace
no descritor de arquivo 7 em vez do padrão 2, e redirecionar esse descritor de arquivo para /dev/null
. O número fd é arbitrário. Use um fd acima de 2 que não seja usado no seu script. Se o shell em que você está inserindo este comando for bash
ou yash
, você pode até usar um número acima de 9 (embora você possa ter problemas se o descritor de arquivo for usado internamente pelo shell).
Se o shell do qual você está chamando o script bash
for zsh
, você também poderá fazer:
(export BASH_XTRACEFD; ./script.bash {BASH_XTRACEFD}> /dev/null)
para a variável a ser atribuída automaticamente o primeiro fd livre acima de 9.
Para versões anteriores de bash
, outra opção, se o xtrace
estiver ativado com set -x
(em oposição a #! /bin/bash -x
ou set -o xtrace
) seria redefinir set
como uma função exportada não faz nada quando passa -x
(embora isso quebre o script se ele (ou qualquer outro script bash
invocado) usar set
para definir os parâmetros posicionais).
Como:
set()
case $1 in
(-x) return 0;;
(-[!-]|"") builtin set "$@";;
(*) echo >&2 That was a bad idea, try something else; builtin set "$@";;
esac
export -f set
./script.bash
Outra opção é adicionar uma interceptação DEBUG em um arquivo $BASH_ENV
que executa set +x
antes de cada comando.
echo 'trap "{ set +x; } 2>/dev/null" DEBUG' > ~/.no-xtrace
BASH_ENV=~/.no-xtrace ./script.bash
Isso não funcionará quando o set -x
for feito em um sub-shell.
Como @ilkkachu disse, desde que você tenha permissão de escrita para qualquer pasta no sistema de arquivos, você deve pelo menos ser capaz de fazer uma cópia do script e editá-lo.
Se não houver nenhum lugar onde você possa escrever uma cópia do script, ou se não for conveniente criar e editar uma nova cópia toda vez que houver uma atualização do script original, você ainda poderá fazer:
bash <(sed 's/set -x/set +x/g' ./script.bash)
Isso (e a abordagem de cópia) pode não funcionar corretamente se o script fizer algo interessante com $0
ou variáveis especiais como $BASH_SOURCE
(como procurar por arquivos relativos à localização do próprio script), portanto talvez você precise fazer mais algumas edições, como substituir $0
pelo caminho do script ...