İle bash4.1 ve üzeri, yapabileceğiniz
BASH_XTRACEFD=7 ./script.bash 7> /dev/null
( basholarak çağrıldığında da çalışır sh).
Temel olarak, bashçıktıyı xtracevarsayılan 2 yerine dosya tanımlayıcı 7'ye çıkarmayı ve bu dosya tanımlayıcıya yeniden yönlendirmeyi söylüyoruz /dev/null. Fd numarası isteğe bağlıdır. Betiğinizde başka şekilde kullanılmayan 2'nin üzerinde bir fd kullanın. Bu komutu girdiğiniz kabuk bashveya ise yash, 9'un üstündeki bir sayıyı bile kullanabilirsiniz (dosya tanımlayıcı kabuk tarafından dahili olarak kullanılıyorsa sorunla karşılaşabilirsiniz).
Bu bashkomut dosyasını çağırdığınız kabuk ise zshşunları da yapabilirsiniz:
(export BASH_XTRACEFD; ./script.bash {BASH_XTRACEFD}> /dev/null)
değişkenin otomatik olarak 9'un üzerindeki ilk boş fd atanması için.
Eski sürümleri için bash, başka bir seçenek, eğer xtraceaçıksa set -x( #! /bin/bash -xveya aksine set -o xtrace) set, aktarıldığında hiçbir şey yapmayan bir dışa aktarma işlevi olarak yeniden tanımlamak -xolacaktır (ancak komut dosyasını (veya bashçağırdığı herhangi bir komut dosyasını) bozar) setkonum parametrelerini ayarlamak için kullanılır ).
Sevmek:
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
Başka bir seçenek de, her komuttan önce gelen bir $BASH_ENVdosyaya DEBUG tuzağı eklemektir set +x.
echo 'trap "{ set +x; } 2>/dev/null" DEBUG' > ~/.no-xtrace
BASH_ENV=~/.no-xtrace ./script.bash
Yine de set -xbir alt kabukta yapıldığında bu işe yaramaz .
@İlkkachu'nun dediği gibi, dosya sistemindeki herhangi bir klasöre yazma izniniz varsa, en azından komut dosyasının bir kopyasını oluşturabilir ve düzenleyebilirsiniz.
Komut dosyasının bir kopyasını yazabileceğiniz bir yer yoksa veya orijinal komut dosyasında her güncelleme olduğunda yeni bir kopya oluşturup düzenlemek uygun değilse, yine de yapabilirsiniz:
bash <(sed 's/set -x/set +x/g' ./script.bash)
Komut dosyası ile süslü bir şey $0veya özel değişkenler $BASH_SOURCE(komut dosyasının kendisiyle ilgili dosyalara bakmak gibi) yaparsa, bu (ve kopya yaklaşımı) düzgün çalışmayabilir , bu nedenle aşağıdaki gibi bazı düzenlemeler yapmanız gerekebilir $0betiğin yoluyla değiştir ...
./script 2>some_file