Yazılımın yüklü olup olmadığını tespit etmenin en iyi yolu nedir?


9

Daha önce whichfarklı platformlarda (Linux vs. Solaris vx. OS X) komuttan elde edilen çıktı farklılıklarıyla, muhtemelen meseleyi de oynayan farklı kabuklarla hayal kırıklığına uğradım . typedaha iyi bir alternatif olarak önerildi, ancak bu ne kadar taşınabilir?

Geçmişte which, karşılaştığım farklı kullanım durumlarının çıktısını ayrıştıran ve işleyen işlevler yazdım . Kullandığım makineler arasında çalışıyorlar ve bu yüzden kişisel senaryolarım için uygun, ancak bu, başkalarının kullanması için bir yere göndereceğim yazılımlar için çok güvenilmez görünüyor.

Olası bir örneği ele almak için, bir komut dosyasından bash ve zsh'nin bir makinede mevcut olup olmadığını tespit etmem gerektiğini varsayalım ve eğer varsa zsh ile bir komut çalıştırır ve zsh yoksa ve bash yeterliyse bash ile sürümünde belirli bir hata olmamalıdır. Senaryonun geri kalanının çoğu Bourne kabuğu veya Ruby veya başka bir şey olabilir, ancak bu özel bir şey (AFAIK) zsh veya son bash sürümü ile yapılmalıdır.

typePlatformlarda kullanılabilir olmaya güvenebilir miyim ? whichBelirli bir yazılım parçasının yüklü olup olmadığı sorusuna kolay ve tutarlı bir şekilde cevap verebilecek başka bir alternatif var mı ?

(Verdiğim örnekle özellikle ilgili fikirler vermek istiyorsanız, bu harika, ama esas olarak sadece genel durum hakkında sorular soruyorum: belirli bir şeyin belirli bir makineye yüklü olup olmadığını öğrenmenin en güvenilir yolu nedir? ?)

Yanıtlar:


10

21. yüzyılda, özellikle bash veya zsh olması muhtemel makineleri hedefliyorsanız, kullanılabilir olmaya güvenebilirsiniz type. (1970'lerde veya 1980'lerin başında olduğu gibi son derece eski birleşimlerde yoktu.) Çıktısına hiçbir şey ifade edemezsiniz, ancak bu adla bir komut varsa ve 0 döndürdüğüne güvenebilirsiniz. aksi halde sıfır.

whichstandart değildir ve pratikte güvenilmezdir . typeönerilen alternatiftir. whereisaynı sorunlardan muzdarip whichve daha az yaygındır. whenceksh ve zsh'ye özgüdür.

Bu mümkün olduğunda, bir komutun varlığını test etmek ve davranışının makul görünüp görünmediğini test etmek daha güvenilir olacaktır. Örneğin, çalıştırarak uygun bir bash sürümünün varlığını test edin bash -c 'somecommand', örn.

# Test for the `-v` operator (which appeared in bash 4.2)
if bash -c 'test -v HOME' 2>/dev/null; then 

Bugün, Singe UNIX spesifikasyonu sürüm 2'deki neredeyse her şeye güvenebilirsiniz (yine de isteğe bağlı Fortran ve SCCS gibi egzotik şeyler hariç). Sürüm 3'ün çoğuna da güvenebilirsiniz , ancak bu henüz her yerde tam olarak uygulanmamıştır. Sürüm 4 desteği sketchier olduğunu. Bu özellikleri okuyacaksanız, sürüm 2'den çok daha okunabilir ve daha az belirsiz olan sürüm 3'ü okumanızı tavsiye ederim.

Sistem özelliklerinin nasıl algılanacağına ilişkin örnekler için, autoconf'a ve configureçeşitli yazılımların komut dosyalarına bakın.

Daha fazla ipucu için bkz. Taşınabilir kabuk programlama kaynakları .


Bu, hashve kullanarak yaygın olarak önerilen teknikler hakkında yorum yapmak için genişlemeden yararlanabilir command -v.
Caleb

@Caleb Bu sorunun amacı için, command -vfazla bir fayda görmüyorum type, tek ihtiyacımız olan bir boole sonucudur. Hangi “yaygın olarak kullanılan tekniklerden hash” bahsediyorsunuz?
Gilles 'SO- kötü olmayı kes'
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.