Cara mengesan pelaksanaan arahan dalam skrip shell dengan pengesanan shell
- 4408
- 1267
- Clarence Powlowski
Dalam artikel siri debugging skrip shell ini, kami akan menerangkan mod debugging skrip shell ketiga, iaitu pelacakan shell dan melihat beberapa contoh untuk menunjukkan bagaimana ia berfungsi, dan bagaimana ia boleh digunakan.
Bahagian sebelumnya siri ini jelas melemparkan cahaya ke atas dua mod debugging skrip shell lain: mod verbose dan Pemeriksaan sintaks mod dengan contoh yang mudah difahami bagaimana untuk membolehkan skrip shell debugging dalam mod ini.
- Cara Membolehkan Mod Debugging Skrip Shell Di Linux - Bahagian 1
- Cara Melakukan Sintaks Memeriksa Mod Debugging Dalam Skrip Shell - Bahagian 2
Pelacakan shell hanya bermaksud mengesan pelaksanaan perintah dalam skrip shell. Untuk menghidupkan pengesanan shell, gunakan -x
Pilihan Debugging.
Ini mengarahkan shell untuk memaparkan semua arahan dan hujah mereka di terminal kerana mereka dilaksanakan.
Kami akan menggunakan sys_info.sh
Skrip shell di bawah, yang secara ringkas mencetak tarikh dan masa sistem anda, bilangan pengguna yang log masuk dan uptime sistem. Walau bagaimanapun, ia mengandungi ralat sintaks yang perlu kita cari dan betul.
#!/bin/bash #script untuk mencetak maklumat sistem ringkas root_id = "0" date = "date" no_users = "who | wc -l" uptime = "uptime" check_root () if ["$ uid" -ne "root_id "]; Kemudian echo "Anda tidak dibenarkan melaksanakan program ini!"Keluar 1; print_sys_info () echo" masa sistem: $ date "echo" bilangan pengguna: $ no_users "echo" sistem uptime: $ uptime check_root print_sys_info exit 0
Simpan fail dan buat skrip boleh dilaksanakan. Skrip hanya boleh dijalankan oleh Root, oleh itu menggunakan arahan sudo untuk menjalankannya seperti di bawah:
$ chmod +x sys_info.sh $ sudo bash -x sys_info.shShell Tracing - Tunjukkan ralat dalam skrip
Dari output di atas, kita dapat memerhatikan bahawa, perintah pertama kali dilaksanakan sebelum outputnya digantikan sebagai nilai pembolehubah.
Contohnya, Tarikh pertama kali dilaksanakan dan outputnya digantikan sebagai nilai pembolehubah TARIKH.
Kami boleh melakukan pemeriksaan sintaks untuk hanya memaparkan ralat sintaks seperti berikut:
$ sudo bash -n sys_info.shPemeriksaan sintaks dalam skrip
Sekiranya kita melihat skrip shell secara kritis, kita akan menyedari bahawa jika pernyataan
kehilangan penutupan fi
perkataan. Oleh itu, marilah kita menambahkannya dan skrip baru kini kelihatan seperti di bawah:
#!/bin/bash #script untuk mencetak maklumat sistem ringkas root_id = "0" date = "date" no_users = "who | wc -l" uptime = "uptime" check_root () if ["$ uid" -ne "root_id "]; Kemudian echo "Anda tidak dibenarkan melaksanakan program ini!"Keluar 1; fi print_sys_info () echo" masa sistem: $ date "echo" bilangan pengguna: $ no_users "echo" sistem uptime: $ uptime check_root print_sys_info exit 0
Simpan fail sekali lagi dan serahkannya sebagai akar dan lakukan pemeriksaan sintaks:
$ sudo bash -n sys_info.shLakukan semak sintaks dalam skrip shell
Hasil operasi pemeriksaan sintaks kami di atas masih menunjukkan bahawa terdapat satu lagi bug dalam skrip kami Baris 21. Oleh itu, kami masih mempunyai pembetulan sintaks yang perlu dilakukan.
Sekiranya kita melihat skrip secara analitik sekali lagi, ralat pada Baris 21 disebabkan oleh petikan ganda penutupan yang hilang (")
dalam perintah echo terakhir di dalam print_sys_info
fungsi.
Kami akan menambah petikan ganda penutupan di echo Perintah dan simpan fail. Skrip yang diubah di bawah:
#!/bin/bash #script untuk mencetak maklumat sistem ringkas root_id = "0" date = "date" no_users = "who | wc -l" uptime = "uptime" check_root () if ["$ uid" -ne "root_id "]; Kemudian echo "Anda tidak dibenarkan melaksanakan program ini!"Keluar 1; fi print_sys_info () echo" masa sistem: $ date "echo" bilangan pengguna: $ no_users "echo" sistem uptime: $ uptime " check_root print_sys_info exit 0
Sekarang sintaktik periksa skrip sekali lagi.
$ sudo bash -n sys_info.sh
Perintah di atas tidak akan menghasilkan apa -apa output kerana skrip kami sekarang betul sintaksis. Kita juga dapat mengesan pelaksanaan skrip untuk kali kedua dan ia harus berfungsi dengan baik:
$ sudo bash -x sys_info.shPelaksanaan skrip shell jejak
Sekarang jalankan skrip.
$ sudo ./sys_info.shSkrip shell untuk menunjukkan tarikh, masa dan masa uptime
Kepentingan pelaksanaan pelaksanaan skrip shell
Penjejakan skrip shell membantu kami mengenal pasti kesilapan sintaks dan lebih penting lagi, kesilapan logik. Ambil contohnya check_root
berfungsi dalam sys_info.sh
skrip shell, yang bertujuan untuk menentukan sama ada pengguna adalah akar atau tidak, kerana skrip hanya dibenarkan untuk dilaksanakan oleh superuser.
check_root () if ["$ uid" -ne "$ root_id"]; Kemudian echo "Anda tidak dibenarkan melaksanakan program ini!"Keluar 1; fi
Keajaiban di sini dikawal oleh jika pernyataan
ungkapan ["$ Uid" -ne "$ root_id"]
, Sebaik sahaja kita tidak menggunakan pengendali berangka yang sesuai (-ne
Dalam kes ini, yang bermaksud tidak sama), kita berakhir dengan kemungkinan ralat logik.
Dengan mengandaikan bahawa kami menggunakan -Pers
(bermaksud sama dengan), ini akan membenarkan mana -mana pengguna sistem serta pengguna root untuk menjalankan skrip, oleh itu ralat logik.
check_root () if ["$ uid" -eq "$ root_id"]; Kemudian echo "Anda tidak dibenarkan melaksanakan program ini!"Keluar 1; fi
Catatan: Seperti yang kita lihat sebelum ini pada permulaan siri ini, perintah terbina dalam set shell dapat mengaktifkan debugging di bahagian tertentu skrip shell.
Oleh itu, garis di bawah akan membantu kita mencari ralat logik ini dalam fungsi dengan mengesan pelaksanaannya:
Skrip dengan ralat logik:
#!/bin/bash #script untuk mencetak maklumat sistem ringkas root_id = "0" date = "date" no_users = "who | wc -l" uptime = "uptime" check_root () if ["$ uid" -eq "$ root_id "]; Kemudian echo "Anda tidak dibenarkan melaksanakan program ini!"Keluar 1; fi print_sys_info () echo" masa sistem: $ date "echo" bilangan pengguna: $ no_users "echo" sistem uptime: $ uptime " #turning on dan off debugging fungsi check_root set -x; check_root ; set +x; print_sys_info Exit 0
Simpan fail dan memohon skrip, kita dapat melihat bahawa pengguna sistem biasa dapat menjalankan skrip tanpa sudo Seperti dalam output di bawah. Ini kerana nilai ID PENGGUNA adalah 100 yang tidak sama dengan akar Root_id iaitu 0.
$ ./sys_info.shJalankan skrip shell tanpa sudo
Nah, itu buat masa ini, kami telah sampai ke akhir siri debugging skrip shell, borang tindak balas di bawah boleh digunakan untuk menangani sebarang pertanyaan atau maklum balas kepada kami, mengenai panduan ini atau keseluruhan siri 3 bahagian.
- « Betulkan Ralat 2003 (HY000) tidak dapat menyambung ke MySQL Server pada '127.0.0.1 '(111)
- 3 Alat Pengimbasan Cakera Linux Berasaskan Terminal dan Terminal »