Com bash
4.1 e acima, você pode fazer
BASH_XTRACEFD=7 ./script.bash 7> /dev/null
(também funciona quando bash
é chamado como sh
).
Basicamente, estamos dizendo bash
para produzir a xtrace
saída 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 em seu script. Se o shell no qual você está inserindo esse comando for bash
ou yash
, você pode até usar um número acima de 9 (embora possa haver problemas se o descritor de arquivo for usado internamente pelo shell).
Se o shell do qual você está chamando esse bash
script for zsh
, você também pode:
(export BASH_XTRACEFD; ./script.bash {BASH_XTRACEFD}> /dev/null)
para que a variável seja atribuída automaticamente ao primeiro fd livre acima de 9.
Para versões mais antigas de bash
, outra opção, se a opção xtrace
estiver ativada com set -x
(em oposição a #! /bin/bash -x
ou set -o xtrace
), seria redefinir set
como uma função exportada que não faz nada quando aprovada -x
(embora isso interrompa o script se ele (ou qualquer outro bash
script que ele chama) usado set
para definir os parâmetros posicionais).
Gostar:
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 $BASH_ENV
arquivo 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 set -x
for feito em um sub-shell.
Como o @ilkkachu disse, desde que você tenha permissão de gravação para qualquer pasta no sistema de arquivos, você deve pelo menos conseguir fazer uma cópia do script e editá-lo.
Se não houver lugar em que você possa escrever uma cópia do script, ou se não for conveniente fazer e editar uma nova cópia sempre que houver uma atualização no script original, você ainda poderá:
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 faz algo sofisticado $0
ou variáveis especiais como $BASH_SOURCE
(como procurar arquivos que sejam relativos ao local do próprio script), portanto, talvez seja necessário editar mais, como substitua $0
pelo caminho do script ...
./script 2>some_file