Con la versione bash
4.1 e successive, puoi farlo
BASH_XTRACEFD=7 ./script.bash 7> /dev/null
(funziona anche quando bash
viene invocato come sh
).
Fondamentalmente, stiamo dicendo bash
di produrre l' xtrace
output sul descrittore di file 7 anziché il valore predefinito di 2 e reindirizzare il descrittore di file a /dev/null
. Il numero fd è arbitrario. Usa un fd sopra 2 che non sia altrimenti usato nel tuo script. Se la shell in cui stai inserendo questo comando è bash
o yash
, puoi persino usare un numero superiore a 9 (anche se potresti riscontrare problemi se il descrittore di file viene utilizzato internamente dalla shell).
Se la shell da cui stai chiamando lo bash
script è zsh
, puoi anche fare:
(export BASH_XTRACEFD; ./script.bash {BASH_XTRACEFD}> /dev/null)
per assegnare automaticamente alla variabile il primo fd libero sopra 9.
Per le versioni precedenti di bash
, un'altra opzione, se l'opzione xtrace
è attivata con set -x
(al contrario di #! /bin/bash -x
o set -o xtrace
) sarebbe quella di ridefinire set
come una funzione esportata che non fa nulla quando viene passata -x
(anche se ciò spezzerebbe lo script se (o qualsiasi altro bash
script che invoca) utilizzato set
per impostare i parametri posizionali).
Piace:
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
Un'altra opzione è quella di aggiungere una trap DEBUG in un $BASH_ENV
file che fa set +x
prima di ogni comando.
echo 'trap "{ set +x; } 2>/dev/null" DEBUG' > ~/.no-xtrace
BASH_ENV=~/.no-xtrace ./script.bash
set -x
Tuttavia, ciò non funzionerà quando viene eseguito in una sotto-shell.
Come ha detto @ilkkachu, purché tu abbia l'autorizzazione in scrittura per qualsiasi cartella sul filesystem, dovresti almeno essere in grado di fare una copia dello script e modificarlo.
Se non c'è nessun posto in cui puoi scrivere una copia dello script, o se non è conveniente creare e modificare una nuova copia ogni volta che c'è un aggiornamento allo script originale, potresti comunque essere in grado di fare:
bash <(sed 's/set -x/set +x/g' ./script.bash)
Quello (e l'approccio alla copia) potrebbe non funzionare correttamente se lo script fa qualcosa di fantasioso $0
o variabili speciali come $BASH_SOURCE
(come la ricerca di file relativi alla posizione dello script stesso), quindi potrebbe essere necessario apportare ulteriori modifiche come sostituisci $0
con il percorso dello script ...
./script 2>some_file