Periksa dependensi skrip bash / shell


13

Apakah ada metode / perintah untuk memeriksa dependensi skrip bash? Dengan kata lain, respons terhadap pertanyaan ini: Perpustakaan mana yang harus dipasang pengguna untuk menjalankan skrip?

Saya bisa melakukan ini secara manual dengan membaca skrip dan memeriksa apa perpustakaan lain / perintah itu panggilan tetapi ini tidak jelas untuk skrip panjang.

Jawaban:


8

Sistem autoconf yang sangat misterius telah digunakan untuk itu

menghasilkan skrip shell untuk secara otomatis mengkonfigurasi paket kode sumber perangkat lunak. Skrip ini dapat mengadaptasi paket ke banyak jenis sistem seperti UNIX tanpa intervensi pengguna manual. Autoconf membuat skrip konfigurasi untuk paket dari file templat yang mencantumkan fitur sistem operasi yang dapat digunakan paket, dalam bentuk panggilan makro M4.

Jika itu tidak cukup menakutkan, tunggu sampai Anda mencoba menulis skrip autoconf pertama Anda. Para penulis autoconf tidak malu dengan kesulitannya :

Mereka yang tidak mengerti Autoconf dikutuk untuk menemukan kembali, buruk. Tujuan utama Autoconf adalah membuat hidup pengguna lebih mudah; membuat hidup pemelihara lebih mudah hanyalah tujuan sekunder. Dengan kata lain, tujuan utama bukanlah untuk membuat generasi configure otomatis untuk pengelola paket; alih-alih, tujuannya adalah membuat konfigurasi tidak menyakitkan, portabel, dan dapat diprediksi untuk pengguna akhir dari setiap paket yang diautoconfiscated. Dan untuk tingkat ini, Autoconf sangat berhasil pada tujuannya - sebagian besar keluhan pada daftar Autoconf adalah tentang kesulitan dalam menulis input Autoconf, dan tidak dalam perilaku konfigurasi yang dihasilkan.

Di sisi lain, Anda akan keluar dari proses mengetahui lebih banyak tentang bit fiddly dari berbagai sistem daripada yang pernah Anda bayangkan ada.

Hari ini, secara pribadi, saya akan menganggap distribusi Debian-ish yang jauh lebih standar adalah target saya dan tidak membuat diri saya menulis skrip autoconf lain. Saya beruntung memiliki kemewahan untuk memilih itu; Anda mungkin tidak memiliki garis lintang seperti itu.


3

Ini bukan tugas yang mudah untuk diotomatisasi, karena skrip dapat menggunakan konstruksi yang mengalahkan analisis statis. Jika pernah menggunakan evalatau awalan apa pun seperti timeatau nice, itu tidak akan sesederhana menjalankan sesuatu seperti egrep -o '^[^ ]+ ? 'untuk mendapatkan perintah dan menjalankannya melalui whichatau type.

Pada akhirnya, satu-satunya cara untuk benar-benar yakin adalah dengan menjalankan skrip dan mencari tahu apa yang gagal. Jika skrip ditulis dengan baik, skrip akan memeriksa perintah yang tidak standar sebelum dijalankan. Jika tidak, coba-coba adalah satu-satunya cara untuk memastikan.

Karena itu, sesuatu seperti ini dapat membantu:

#!/bin/bash
egrep -o -e '^[^ ]+ ? ' -e '[a-zA-Z0-9]+' "$1" | sort -u | {
    while read line
    do
        if type $line &>/dev/null
        then
            echo "$line found"
        else
            echo "Error: $line not found"
        fi
    done
} | sort

Outputnya akan terlihat seperti:

$ ./check i_wonder.sh
cd found
echo found
elif found
else found
Error: abort not found
Error: checkurl not found
Error: cleanup not found
Error: count not found
Error: debug not found
Error: deleteFile not found
Error: die not found
find found
for found
grep found
if found
mv found
readarray found
rm found
shopt found
size found
sleep found
stat found
trap found
unset found
while found
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.