Apa yang dilakukan `set -x`?

261

Saya memiliki skrip shell dengan baris berikut di dalamnya:

[ "$DEBUG" == 'true' ] && set -x
Ole
sumber
15
Lihatlah:help -m set | less
Cyrus
4
Terima kasih atas help -m settipnya. Itu bekerja. Saya mencoba man setsebelum bertanya, namun di ubuntu adaNo manual entry for set
Ole
2
@Ole, setdibangun menjadi bash jadi jika man bashAnda dapat menemukannya di bagian SHELL BUILTIN COMMANDS. Saat melihat halaman manual Anda mungkin dapat melompat ke sana dengan mencari regexp ini: \bset \[.
User5910

Jawaban:

365

set -xmemungkinkan mode shell di mana semua perintah yang dieksekusi dicetak ke terminal. Dalam kasus Anda, ini jelas digunakan untuk debugging, yang merupakan kasus penggunaan umum untuk set -x: mencetak setiap perintah saat dijalankan dapat membantu Anda untuk memvisualisasikan aliran kontrol skrip jika tidak berfungsi seperti yang diharapkan.

set +x menonaktifkannya.

John Zwinck
sumber
5
Bagaimana cara menonaktifkan fitur itu lagi?
feedc0de
85
@DanielBrunner: set +xmenonaktifkannya.
John Zwinck
2
Ini SANGAT bermanfaat! Saya berharap seseorang mengatakan kepada saya sebelumnya. Adakah trik lain yang menarik seperti ini yang dapat meningkatkan meta-skill kita dalam scripting?
Siswa
7
@Student: set -edi bagian atas skrip Anda akan membuat skrip keluar dengan kesalahan setiap kali terjadi kesalahan (dan tidak ditangani secara eksplisit). Saya menemukan bahwa jauh lebih disukai daripada default, yaitu untuk tetap mau mau tak mau (seperti Visual Basic terkenal On Error Resume Next).
John Zwinck
1
@JohnZwinck, sayangnya, set -ememiliki efek samping yang sangat tidak diinginkan, sampai-sampai membuat peninjauan kode hampir tidak mungkin (karena perilaku baris tertentu tergantung pada apa yang terjadi pada tumpukan panggilan - jika suatu fungsi dipanggil dalam konteks "diperiksa", set -edinonaktifkan untuk doa itu dan semua yang dipanggilnya). Lihat latihan di BashFAQ # 105 .
Charles Duffy
78

set -x

Mencetak jejak perintah sederhana, untuk perintah, perintah kasus, pilih perintah, dan aritmatika untuk perintah dan argumennya atau daftar kata yang terkait setelah diperluas dan sebelum dieksekusi. Nilai variabel PS4 diperluas dan nilai yang dihasilkan dicetak sebelum perintah dan argumen yang diperluas.

[ sumber ]

Contoh

set -x
echo `expr 10 + 20 `
+ expr 10 + 20
+ echo 30
30

set +x
echo `expr 10 + 20 `
30

Contoh di atas menggambarkan penggunaan set -x. Ketika digunakan, ekspresi aritmatika di atas telah diperluas. Kita bisa melihat bagaimana garis menghanguskan telah dievaluasi langkah demi langkah.

  • Langkah pertama exprtelah dievaluasi.
  • Langkah kedua echotelah dievaluasi.

Untuk mengetahui lebih lanjut tentang set → kunjungi tautan ini

ketika datang ke skrip shell Anda,

[ "$DEBUG" == 'true' ] && set -x

Script Anda mungkin telah mencetak beberapa baris informasi tambahan ketika mode eksekusi dipilih sebagai DEBUG. Secara tradisional orang digunakan untuk mengaktifkan mode debug ketika skrip dipanggil dengan argumen opsional seperti-d

Raju
sumber
6

-u: dinonaktifkan secara default. Saat diaktifkan, pesan kesalahan ditampilkan saat menggunakan variabel yang tidak dikonfigurasi.

-v: tidak aktif secara default. Setelah aktivasi, konten asli dari informasi tersebut akan ditampilkan (tanpa resolusi variabel) sebelum informasi dikeluarkan.

-x: tidak aktif secara default. Jika diaktifkan, konten perintah akan ditampilkan sebelum perintah dijalankan (setelah resolusi variabel, ada simbol ++).

Bandingkan perbedaan berikut:

/ # set -v && echo $HOME
/root
/ # set +v && echo $HOME
set +v && echo $HOME
/root

/ # set -x && echo $HOME
+ echo /root
/root
/ # set +x && echo $HOME
+ set +x
/root

/ # set -u && echo $NOSET
/bin/sh: NOSET: parameter not set
/ # set +u && echo $NOSET
lupguo
sumber