Cara melacak eksekusi perintah dalam skrip shell dengan penelusuran shell

Cara melacak eksekusi perintah dalam skrip shell dengan penelusuran shell

Dalam artikel seri debugging skrip shell ini, kami akan menjelaskan mode debugging skrip shell ketiga, yaitu penelusuran shell dan lihat beberapa contoh untuk menunjukkan cara kerjanya, dan bagaimana cara digunakan.

Bagian sebelumnya dari seri ini jelas menyoroti dua mode debugging skrip shell lainnya: mode verbose Dan Pemeriksaan Sintaks Mode dengan contoh yang mudah dipahami tentang cara mengaktifkan skrip shell debugging dalam mode ini.

  1. Cara mengaktifkan mode debugging skrip shell di linux - bagian 1
  2. Cara melakukan sintaks memeriksa mode debugging di skrip shell - bagian 2

Penelusuran shell berarti melacak eksekusi perintah dalam skrip shell. Untuk menyalakan penelusuran shell, gunakan -X opsi debugging.

Ini mengarahkan shell untuk menampilkan semua perintah dan argumen mereka di terminal saat mereka dieksekusi.

Kami akan menggunakan sys_info.SH Skrip shell di bawah ini, yang secara singkat mencetak tanggal dan waktu sistem Anda, jumlah pengguna yang masuk dan uptime sistem. Namun, itu mengandung kesalahan sintaks yang perlu kita temukan dan perbaiki.

#!/bin/bash #script untuk mencetak info sistem singkat root_id = "0" date = "date" no_users = "Who | wc -l" uptime = "uptime" check_root () if ["$ uid" -ne "$ root_id "]; Kemudian echo "Anda tidak diizinkan untuk menjalankan program ini!"Keluar 1; print_sys_info () echo" waktu sistem: $ date "echo" jumlah pengguna: $ no_users "echo" uptime: $ uptime check_root print_sys_info keluar 0 

Simpan file dan buat skrip dapat dieksekusi. Script hanya dapat dijalankan dengan root, oleh karena itu menggunakan perintah sudo untuk menjalankannya seperti di bawah ini:

$ chmod +x sys_info.sh $ sudo bash -x sys_info.SH 
Shell Tracing - Tampilkan kesalahan dalam skrip

Dari output di atas, kita dapat mengamati bahwa, perintah pertama kali dieksekusi sebelum outputnya diganti sebagai nilai variabel.

Misalnya, tanggal pertama kali dieksekusi dan outputnya diganti sebagai nilai variabel TANGGAL.

Kami dapat melakukan pemeriksaan sintaks hanya untuk menampilkan kesalahan sintaks sebagai berikut:

$ sudo bash -n sys_info.SH 
Sintaksis memeriksa skrip

Jika kita melihat skrip shell secara kritis, kita akan menyadari bahwa Jika pernyataan tidak ada penutupan fi kata. Karena itu, mari kita tambahkan dan skrip baru sekarang harus terlihat seperti di bawah ini:

#!/bin/bash #script untuk mencetak info sistem singkat root_id = "0" date = "date" no_users = "Who | wc -l" uptime = "uptime" check_root () if ["$ uid" -ne "$ root_id "]; Kemudian echo "Anda tidak diizinkan untuk menjalankan program ini!"Keluar 1; fi print_sys_info () echo" waktu sistem: $ date "echo" jumlah pengguna: $ no_users "echo" sistem uptime: $ uptime check_root print_sys_info keluar 0 

Simpan file lagi dan anggap itu sebagai root dan lakukan beberapa sintaksis pemeriksaan:

$ sudo bash -n sys_info.SH 
Lakukan Sintaks Check in Shell Script

Hasil dari operasi pemeriksaan sintaks kami di atas masih menunjukkan bahwa ada satu bug lagi dalam skrip kami Baris 21. Jadi, kami masih memiliki beberapa koreksi sintaksis.

Jika kita melihat skrip secara analitik sekali lagi, kesalahannya Baris 21 disebabkan oleh penawaran ganda penutupan yang hilang (") dalam perintah gema terakhir di dalam print_sys_info fungsi.

Kami akan menambahkan penawaran ganda penutup di gema Perintah dan simpan file. Skrip yang diubah di bawah:

#!/bin/bash #script untuk mencetak info sistem singkat root_id = "0" date = "date" no_users = "Who | wc -l" uptime = "uptime" check_root () if ["$ uid" -ne "$ root_id "]; Kemudian echo "Anda tidak diizinkan untuk menjalankan program ini!"Keluar 1; fi print_sys_info () echo" waktu sistem: $ date "echo" jumlah pengguna: $ no_users "echo" sistem uptime: $ uptime " check_root print_sys_info keluar 0 

Sekarang periksa skrip secara sintaksis sekali lagi.

$ sudo bash -n sys_info.SH 

Perintah di atas tidak akan menghasilkan output apa pun karena skrip kami sekarang benar secara sintaksis. Kami juga dapat melacak eksekusi skrip untuk kedua kalinya dan itu harus bekerja dengan baik:

$ sudo bash -x sys_info.SH 
Lacak eksekusi skrip shell

Sekarang jalankan skripnya.

$ sudo ./sys_info.SH 
Skrip shell untuk menampilkan tanggal, waktu dan waktu kerja

Pentingnya penelusuran eksekusi skrip shell

Penelusuran skrip shell membantu kita mengidentifikasi kesalahan sintaksis dan yang lebih penting, kesalahan logis. Ambil contoh check_root fungsi di sys_info.SH skrip shell, yang dimaksudkan untuk menentukan apakah pengguna root atau tidak, karena skrip hanya diizinkan untuk dieksekusi oleh superuser.

check_root () if ["$ uid" -ne "$ root_id"]; Kemudian echo "Anda tidak diizinkan untuk menjalankan program ini!"Keluar 1; fi 

Keajaiban di sini dikendalikan oleh Jika pernyataan ekspresi ["$ Uid" -ne "$ root_id"], Setelah kami tidak menggunakan operator numerik yang sesuai (-ne Dalam hal ini, yang berarti tidak sama), kami berakhir dengan kemungkinan kesalahan logis.

Dengan asumsi bahwa kami menggunakan -Persamaan (berarti sama dengan), ini akan memungkinkan pengguna sistem mana pun serta pengguna root untuk menjalankan skrip, karenanya kesalahan logis.

check_root () if ["$ uid" -eq "$ root_id"]; Kemudian echo "Anda tidak diizinkan untuk menjalankan program ini!"Keluar 1; fi 

Catatan: Seperti yang kita lihat sebelumnya di awal seri ini, perintah set shell bawa dapat mengaktifkan debugging di bagian tertentu dari skrip shell.

Oleh karena itu, baris di bawah ini akan membantu kita menemukan kesalahan logis ini dalam fungsi dengan menelusuri eksekusi:

Skrip dengan kesalahan logis:

#!/bin/bash #script untuk mencetak info sistem singkat root_id = "0" date = "date" no_users = "Who | wc -l" uptime = "uptime" check_root () if ["$ uid" -eq "$ root_id "]; Kemudian echo "Anda tidak diizinkan untuk menjalankan program ini!"Keluar 1; fi print_sys_info () echo" waktu sistem: $ date "echo" Jumlah pengguna: $ no_users "echo" sistem uptime: $ uptime " #turning on dan off debugging fungsi check_root set -x; check_root; check_root check_root ; set +x; print_sys_info keluar 0 

Simpan file dan panggil skrip, kita dapat melihat bahwa pengguna sistem biasa dapat menjalankan skrip tanpa sudo Seperti pada output di bawah ini. Ini karena nilai IDENTITAS PENGGUNA adalah 100 yang tidak sama dengan root Root_id yang 0.

$ ./sys_info.SH 
Jalankan skrip shell tanpa sudo

Nah, itu saja untuk saat ini, kami telah sampai di akhir seri debugging skrip shell, formulir respons di bawah ini dapat digunakan untuk menjawab pertanyaan atau umpan balik kepada kami, mengenai panduan ini atau seluruh seri 3-bagian.