2011-09-26 2 views
7

Bazı komut ve diğer araçları kullanan kabuk komut dosyaları var.Kabuk betiğinde kullanılan tüm araçlar nasıl alınır

Bu nedenle, kabuk komut dosyalarının kullandığı tüm programları listelemenin bir yolu var mı? Kaynak koddan bağımlılıkları almanın yolu.

+0

Sorunuz örneğin "bir araç ayrıştırmak", belirsizdir anlamlı değildir. Komut dosyanızın kullandığı programların bir listesini mi arıyorsunuz? Veya komut dosyalarınızı kullanan programların listesi? –

+0

Güncel soru. Kabuk betiğini kullanan programların listesini arıyorum. – deimus

cevap

2

Boruları ve $( satırlarını çeviri yapmak için 'u kullanır ve sonra bir komutun söz konusu olabileceği satırın ilk sözcüğünü çıkarmak için awk'u kullanır. which içine borular PATH içinde potiential komut kelimeleri bulmak için:

sed 's/|\|\$(/\n/g' FILENAME | 
awk '$1~/^#/ {next} $1~/=/ {next} /^[[:space:]]*$/ {next} {print $1}' | 
sort -u | 
xargs which 2>/dev/null 
2

Bunu yapmanın bir yolu, çalışma zamanındadır. debug mode'da bash komut dosyasını -x seçeneğiyle çalıştırabilir ve daha sonra bu çıktıyı ayrıştırabilirsiniz. Tüm yürütülen komutlar ve onların argümanları standart çıktıya basılacaktır. Ben genel bir çözüm varken

+0

bash --rpm-require bunu daha fazla insan tarafından okunabilir şekilde yapar ... komut dosyasını çalıştırmadan bunu yapma seçeneğini bilmiyor musunuz? – deimus

+0

Komut dosyasını çalıştırmadan güvenilir bir şekilde yapabileceğinizi düşünmüyorum. [İşte] (http://stackoverflow.com/questions/3926918/determine-function-and-file-dependency-of-a-shell-script/3928062#3928062) muhtemelen bunu yapabileceğini bulduğum tek araç. – ks1322

1

, iki yaklaşım deneyebilirsiniz: komut dosyası tarafından infaz edildiği programların görmek için strace kullanabilir

  1. .
  2. Programınızı bir pusilder ortamında çalıştırabilir ve hangi paketlerin eksik olduğunu görebilirsiniz.
0

Kabuğun dinamik yapısı nedeniyle, komut dosyası çalıştırmadan bunu yapamazsınız. Örneğin

:

TASK="cc foo.c" 
time $TASK 

Bu cc yukarıdaki gibi bile böyle önemsiz örnekte adını taşıdığını çalıştırmadan belirlemek gerçekten zor olacaktır. Bir çalışma zamanında, sh -x myscript hata ayıklama çıktısını tıton (+1) ve ks1322 (+1) ile işaretli olarak denetleyebilirsiniz. Ayrıca tüm exec() syscalls yakalamak için strace gibi araç yapabilirsiniz.