Con bash4.1 y superior, puedes hacer
BASH_XTRACEFD=7 ./script.bash 7> /dev/null
(también funciona cuando bashse invoca como sh).
Básicamente, le estamos diciendo basha la salida de la xtracesalida en el descriptor de archivo de 7 en lugar del predeterminado de 2, y la redirección que descriptor de archivo a /dev/null. El número fd es arbitrario. Use un fd superior a 2 que no se use de otra manera en su secuencia de comandos. Si la envoltura que está entrando en este comando es basho yash, incluso se puede utilizar un número superior a 9 (aunque es posible que encuentre problemas si el descriptor de archivo es usado internamente por la cáscara).
Si la envoltura que está llamando que bashla escritura es de zsh, también se puede hacer:
(export BASH_XTRACEFD; ./script.bash {BASH_XTRACEFD}> /dev/null)
para que la variable se asigne automáticamente el primer fd libre por encima de 9.
Para versiones anteriores de bash, otra opción, si xtracese activa con set -x(en lugar de #! /bin/bash -xo set -o xtrace) sería redefinir setcomo una función exportada que no hace nada cuando se pasa -x(aunque eso rompería el script si (o cualquier otro bashscript que invoque) utilizado setpara establecer los parámetros posicionales).
Me gusta:
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
Otra opción es agregar una trampa DEPURACIÓN en un $BASH_ENVarchivo que lo hace set +xantes de cada comando.
echo 'trap "{ set +x; } 2>/dev/null" DEBUG' > ~/.no-xtrace
BASH_ENV=~/.no-xtrace ./script.bash
Sin set -xembargo, eso no funcionará cuando se haga en un sub-shell.
Como @ilkkachu Dicho esto, siempre y cuando tenga permiso de escritura en cualquier carpeta del sistema de archivos, por lo menos debe ser capaz de hacer una copia del guión y editarlo.
Si no hay ningún lugar donde pueda escribir una copia del guión, o si no es conveniente hacer y editar una nueva copia cada vez que hay una actualización del guión original, aún puede hacer:
bash <(sed 's/set -x/set +x/g' ./script.bash)
Eso (y el enfoque de copia) puede no funcionar correctamente si el script hace algo elegante $0o con variables especiales como $BASH_SOURCE(como buscar archivos que estén relacionados con la ubicación del script en sí), por lo que es posible que deba editar un poco más, como reemplazar $0con la ruta del script ...
./script 2>some_file