İle bash
4.1 ve üzeri, yapabileceğiniz
BASH_XTRACEFD=7 ./script.bash 7> /dev/null
( bash
olarak çağrıldığında da çalışır sh
).
Temel olarak, bash
çıktıyı xtrace
varsayı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 bash
veya 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 bash
komut 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 xtrace
açıksa set -x
( #! /bin/bash -x
veya aksine set -o xtrace
) set
, aktarıldığında hiçbir şey yapmayan bir dışa aktarma işlevi olarak yeniden tanımlamak -x
olacaktır (ancak komut dosyasını (veya bash
çağırdığı herhangi bir komut dosyasını) bozar) set
konum 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_ENV
dosyaya DEBUG tuzağı eklemektir set +x
.
echo 'trap "{ set +x; } 2>/dev/null" DEBUG' > ~/.no-xtrace
BASH_ENV=~/.no-xtrace ./script.bash
Yine de set -x
bir 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 $0
veya ö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 $0
betiğin yoluyla değiştir ...
./script 2>some_file