Dengan bash4.1 ke atas, Anda bisa melakukannya
BASH_XTRACEFD=7 ./script.bash 7> /dev/null
(juga berfungsi saat bashdipanggil sebagai sh).
Pada dasarnya, kami menyuruh bashoutput xtraceoutput pada file descriptor 7 bukannya default 2, dan mengarahkan file descriptor ke /dev/null. Nomor fd sewenang-wenang. Gunakan fd di atas 2 yang tidak digunakan dalam skrip Anda. Jika shell yang Anda masukkan perintah ini adalah bashatau yash, Anda bahkan dapat menggunakan angka di atas 9 (meskipun Anda dapat mengalami masalah jika deskriptor file digunakan secara internal oleh shell).
Jika shell yang Anda gunakan bashuntuk skrip itu zsh, Anda juga dapat melakukan:
(export BASH_XTRACEFD; ./script.bash {BASH_XTRACEFD}> /dev/null)
untuk variabel yang secara otomatis diberikan fd gratis pertama di atas 9.
Untuk versi yang lebih lama dari bash, opsi lain, jika xtracedihidupkan dengan set -x(sebagai lawan #! /bin/bash -xatau set -o xtrace) akan mendefinisikan kembali setsebagai fungsi yang diekspor yang tidak melakukan apa-apa ketika disahkan -x(meskipun itu akan merusak skrip jika (atau bashskrip lain yang diminta) digunakan setuntuk mengatur parameter posisi).
Suka:
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
Pilihan lain adalah menambahkan perangkap DEBUG dalam $BASH_ENVfile yang dilakukan set +xsebelum setiap perintah.
echo 'trap "{ set +x; } 2>/dev/null" DEBUG' > ~/.no-xtrace
BASH_ENV=~/.no-xtrace ./script.bash
Itu tidak akan bekerja ketika set -xdilakukan di sub-shell.
Seperti yang dikatakan @ilkkachu, asalkan Anda memiliki izin menulis ke folder apa pun di sistem file, Anda setidaknya harus dapat membuat salinan skrip dan mengeditnya.
Jika tidak ada tempat Anda dapat menulis salinan skrip, atau jika tidak nyaman membuat dan mengedit salinan baru setiap kali ada pembaruan untuk skrip asli, Anda mungkin masih dapat melakukan:
bash <(sed 's/set -x/set +x/g' ./script.bash)
Itu (dan pendekatan penyalinan) mungkin tidak berfungsi dengan baik jika skrip melakukan sesuatu yang disukai $0atau variabel khusus seperti $BASH_SOURCE(seperti mencari file yang relatif terhadap lokasi skrip itu sendiri), jadi Anda mungkin perlu melakukan beberapa pengeditan seperti ganti $0dengan jalur skrip ...
./script 2>some_file