Dengan bash
4.1 ke atas, Anda bisa melakukannya
BASH_XTRACEFD=7 ./script.bash 7> /dev/null
(juga berfungsi saat bash
dipanggil sebagai sh
).
Pada dasarnya, kami menyuruh bash
output xtrace
output 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 bash
atau 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 bash
untuk 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 xtrace
dihidupkan dengan set -x
(sebagai lawan #! /bin/bash -x
atau set -o xtrace
) akan mendefinisikan kembali set
sebagai fungsi yang diekspor yang tidak melakukan apa-apa ketika disahkan -x
(meskipun itu akan merusak skrip jika (atau bash
skrip lain yang diminta) digunakan set
untuk 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_ENV
file yang dilakukan set +x
sebelum setiap perintah.
echo 'trap "{ set +x; } 2>/dev/null" DEBUG' > ~/.no-xtrace
BASH_ENV=~/.no-xtrace ./script.bash
Itu tidak akan bekerja ketika set -x
dilakukan 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 $0
atau variabel khusus seperti $BASH_SOURCE
(seperti mencari file yang relatif terhadap lokasi skrip itu sendiri), jadi Anda mungkin perlu melakukan beberapa pengeditan seperti ganti $0
dengan jalur skrip ...
./script 2>some_file