Dalam skrip shell, bagaimana cara mengulang semua perintah shell yang dipanggil dan memperluas nama variabel apa pun?
Misalnya, diberi baris berikut:
ls $DIRNAME
Saya ingin skrip untuk menjalankan perintah dan menampilkan yang berikut ini
ls /full/path/to/some/dir
Tujuannya adalah untuk menyimpan log dari semua perintah shell yang dipanggil dan argumennya. Apakah mungkin ada cara yang lebih baik untuk menghasilkan log seperti itu?
set -x
akan memberi Anda apa yang Anda inginkan.Berikut ini contoh skrip shell untuk diperagakan:
Ini memperluas semua variabel dan mencetak perintah lengkap sebelum output dari perintah.
Keluaran:
sumber
set -o verbose
atauset -v
(hanya "verbose") atauset -o xtrace
atauset -x
(hanya "xtrace") atauset -xv
(keduanya) atauset -o xtrace -o verbose
(keduanya).Saya menggunakan fungsi untuk menggema dan menjalankan perintah:
Output yang mana
Untuk pipa perintah yang lebih rumit, dll., Anda dapat menggunakan eval:
Output yang mana
sumber
++ set +x
output ketika dimatikan, serta terlihat lebih bersih. Hanya untuk satu atau dua pernyataan, jawaban bhassel menggunakan subkulit adalah yang paling nyaman.set +x
, itu mempengaruhi semua perintah, yang terlalu banyak!cp "foo bar" baz
dancp foo "bar baz"
, misalnya. Jadi, bagus untuk menampilkan informasi kemajuan kepada pengguna; apalagi untuk debugging output atau merekam perintah yang direproduksi. Kasus penggunaan berbeda. Dizsh
, Anda dapat menyimpan kutipan dengan:q
pengubah:exe() { echo '$' "${@:q}" ; "$@" ; }
eval
dari perintah Anda. Jadi jangan berharap itu berfungsi dengan baikexe eval "echo 'eval world'"
!Anda juga dapat mengaktifkan ini untuk baris tertentu dalam skrip Anda dengan membungkusnya
set -x
danset +x
, misalnya,sumber
jawaban shuckc untuk menggemakan baris pilih memiliki beberapa kelemahan: Anda berakhir dengan
set +x
perintah berikut juga digemakan, dan Anda kehilangan kemampuan untuk menguji kode keluar dengan$?
karena ditimpa olehset +x
.Opsi lain adalah menjalankan perintah dalam sebuah subkulit:
yang akan memberi Anda output seperti:
Ini menimbulkan biaya tambahan untuk membuat subkulit baru untuk perintah.
sumber
++ set +x
output.if [ $? -eq 0 ]
denganif (set -x; COMMAND)
.Opsi lain adalah meletakkan "-x" di bagian atas skrip Anda alih-alih pada baris perintah:
sumber
./myScript
danbash myScript
. Masih bagus untuk ditunjukkan, terima kasih.Menurut TLDP 's Bash Panduan untuk Pemula: Bab 2. Menulis dan debugging skrip :
sumber
Ketik "bash -x" pada baris perintah sebelum nama skrip Bash. Misalnya, untuk menjalankan foo.sh, ketikkan:
sumber
Anda dapat menjalankan skrip Bash dalam mode debug dengan
-x
opsi .Ini akan mengulangi semua perintah.
Anda juga dapat menyimpan opsi -x dalam skrip . Cukup tentukan
-x
opsi di shebang.sumber
bash -vx
akan melakukan hal yang sama tetapi tanpa interpolasi variabelUntuk zsh, gema
Dan untuk debugging,
sumber
Untuk
csh
dantcsh
, Anda bisaset verbose
atauset echo
(atau Anda bahkan dapat mengatur keduanya, tetapi sebagian besar waktu dapat mengakibatkan duplikasi).Itu
verbose
pilihan mencetak cukup banyak shell ekspresi yang tepat yang Anda ketik.The
echo
pilihan lebih menunjukkan apa yang akan dijalankan melalui pemijahan.http://www.tcsh.org/tcsh.html/Special_shell_variables.html#verbose
http://www.tcsh.org/tcsh.html/Special_shell_variables.html#echo
Special shell variables
verbose If set, causes the words of each command to be printed, after history substitution (if any). Set by the -v command line option.
echo If set, each command with its arguments is echoed just before it is executed. For non-builtin commands all expansions occur before echoing. Builtin commands are echoed before command and filename substitution, because these substitutions are then done selectively. Set by the -x command line option.
sumber
Output adalah sebagai berikut:
sumber
Untuk memungkinkan perintah majemuk untuk digaungkan, saya menggunakan fungsi
eval
plus Sothexe
untuk menggema dan menjalankan perintah. Ini berguna untuk perintah pipa yang jika tidak hanya akan menampilkan tidak ada atau hanya bagian awal dari perintah pipa.Tanpa eval:
Output:
Dengan eval:
Output yang mana
sumber