Bash / shell komut dosyası bağımlılıklarını denetleme


13

Bir bash betiğinin bağımlılıklarını denetlemek için bir yöntem / komut var mı? Başka bir deyişle, bu soruya bir yanıt: Bir kullanıcı komut dosyasını çalıştırmak için hangi kitaplıkları yüklemelidir?

Komut dosyasını okuyarak bunu yapabilirim ve diğer kütüphaneleri / komutları çağırır, ancak bu uzun komut dosyaları için belirgin değildir.

Yanıtlar:


8

İnanılmaz gizli autoconf sistemi kullanılmıştır

yazılım kaynak kodu paketlerini otomatik olarak yapılandırmak için kabuk komut dosyaları üretebilir. Bu komut dosyaları, manuel kullanıcı müdahalesi olmadan paketleri birçok UNIX benzeri sisteme uyarlayabilir. Autoconf, paketin kullanabileceği işletim sistemi özelliklerini M4 makro çağrıları biçiminde listeleyen bir şablon dosyasından paket için bir yapılandırma komut dosyası oluşturur.

Bu yeterince korkutucu değilse, ilk autoconf betiğinizi yazmaya çalışana kadar bekleyin. Autoconf'un yazarları zorluklarından utangaç değildir :

Autoconf'u anlamayanlar, onu yeniden icat etmeye mahkumdur. Autoconf'un temel amacı kullanıcının hayatını kolaylaştırmaktır; bakımcının hayatını kolaylaştırmak sadece ikincil bir hedeftir. Başka bir deyişle, birincil amaç, paket koruyucular için otomatik yapılandırma oluşturmayı sağlamak değildir; daha ziyade amaç, her bir otoklavlanmış paketin son kullanıcısı için ağrısız, taşınabilir ve öngörülebilir bir yapılandırma sağlamaktır. Ve bu dereceye kadar, Autoconf hedefinde son derece başarılıdır - Autoconf listesine yapılan şikayetlerin çoğu, sonuçtaki yapılandırmanın davranışında değil, Autoconf girdisinin yazılmasındaki zorluklarla ilgilidir.

Öte yandan, çeşitli sistemlerin varolduğunu hayal ettiğinizden daha fazlasını öğrenmek için süreçten çıkacaksınız.

Bugünlerde, şahsen, çok daha standart bir Debian-ish dağıtımının hedefim olduğunu ve kendime başka bir autoconf betiği yazmadığını varsayıyorum. Bunu seçme lüksüne sahip olduğum için şanslıyım; böyle bir enleminiz olmayabilir.


3

Bu, otomatikleştirmek için basit bir görev değildir, çünkü bir komut dosyası statik analizi bozan yapıları kullanabilir. Hiç kullanıyorsa evalya da benzeri herhangi bir önek timeveya nicebu gibi bir şey koşma gibi basit olarak olmayacak egrep -o '^[^ ]+ ? 'almak için komutlar ve yoluyla çalışan whichveya type.

Sonunda, kesinlikle emin olmanın tek yolu betiği çalıştırmak ve neyin başarısız olduğunu bulmaktır. Bir komut dosyası iyi yazılmışsa, çalıştırmadan önce standart olmayan komutları kontrol eder. Değilse, deneme yanılma kesin olmanın tek yoludur.

Bunu söyledikten sonra, böyle bir şey yardımcı olabilir:

#!/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

Çıktı şöyle görünecektir:

$ ./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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.