Di bash, ketika menjalankan dengan -x
opsi, apakah mungkin untuk mengecualikan perintah individual dari gema?
Saya mencoba membuat output serapi mungkin, jadi saya menjalankan bagian-bagian tertentu dari skrip saya dengan subkulit set +x
. Namun, baris set +x
itu sendiri masih bergema dan tidak menambahkan informasi berharga ke output.
Saya ingat kembali pada masa lalu yang buruk .bat
, ketika berlari dengan echo on
, garis individu dapat dikecualikan dengan memulai dengan @
. Apakah ada yang setara dalam bash?
#!/bin/bash -x
function i_know_what_this_does() {
(
set +x
echo do stuff
)
}
echo the next-next line still echoes 'set +x', is that avoidable?
i_know_what_this_does
echo and we are back and echoing is back on
Saat menjalankan hal di atas, output adalah:
+ echo the next-next line still echoes 'set +x,' is that 'avoidable?'
the next-next line still echoes set +x, is that avoidable?
+ i_know_what_this_does
+ set +x
do stuff
+ echo and we are back and echoing is back on
and we are back and echoing is back on
Alasan yang
set +x
dicetak adalah ituset -x
berarti "cetak perintah yang akan Anda jalankan, dengan ekspansi, sebelum menjalankannya . Jadi shell tidak tahu bahwa Anda ingin tidak mencetak apa-apa sampai setelah mencetak garis yang mengatakan tidak untuk mencetak hal-hal. Sejauh pengetahuan saya, tidak ada cara untuk menghentikan hal itu terjadi.sumber
Inilah solusi yang telah Anda cari:
Perintah asli dijalankan di shell yang sama di bawah transformasi identitas. Tepat sebelum berjalan, Anda mendapatkan xtrace non-rekursif dari argumen. Ini memungkinkan Anda untuk melacak perintah yang Anda pedulikan tanpa mengirim spam kepada stederr dengan duplikat salinan setiap perintah "echo".
sumber
perl
(dan masalah dengan perintah multi-line):+() { :;} 2> /dev/null; xtrace() { (PS4=; set -x; + "$@";{ set +x; } 2> /dev/null); "$@";}
set -x
manuver membelikan saya sesuatu yang sebanding dengan hanyaprintf >&2 '+ %s\n' "$*"
?xtrace() { printf >&2 '+ %s\n' "$*"; "$@"; }