Con bash
4.1 y superior, puedes hacer
BASH_XTRACEFD=7 ./script.bash 7> /dev/null
(también funciona cuando bash
se invoca como sh
).
Básicamente, le estamos diciendo bash
a la salida de la xtrace
salida 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 bash
o 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 bash
la 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 xtrace
se activa con set -x
(en lugar de #! /bin/bash -x
o set -o xtrace
) sería redefinir set
como una función exportada que no hace nada cuando se pasa -x
(aunque eso rompería el script si (o cualquier otro bash
script que invoque) utilizado set
para 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_ENV
archivo que lo hace set +x
antes de cada comando.
echo 'trap "{ set +x; } 2>/dev/null" DEBUG' > ~/.no-xtrace
BASH_ENV=~/.no-xtrace ./script.bash
Sin set -x
embargo, 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 $0
o 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 $0
con la ruta del script ...
./script 2>some_file