SORU
26 ŞUBAT 2009, PERŞEMBE


Bir program olmadığını kontrol bash bir komut dosyası var

Nasıl bir programın var olduğunu doğrulamak istiyorsunuz? Sonra da hata ve bir çıkış iade veya senaryo ile devam edecek.

Kolay olması gerektiği gibi görünüyor, ama beni şaşırtmak oldu.

CEVAP
24 Mart 2009, Salı


Evet; önlemek which. Sadece, bir dış işlemi sensin başlatılması için yapmak çok küçük (anlam yerleşiklere gibi hash, type command yol daha ucuz), aynı zamanda itimat da yerleşiklere için tam olarak ne istiyorsun, süre etkilerini dış komutları kolayca değişir, Sistem, Sistem.

Neden bakım?

  • Birçok işletim sistemi which varhatta bir çıkış durumunu ayarlamak yok, if which foo bile yok ve işe yaramaz anlamıher zamanfoo (bazı POSIX kabukları hash da bunu yapmak için göründüğüne dikkat edin) değilse bile varsa, bu rapor.
  • Birçok işletim sistemi which özel ve kötü şeyler çıktı değiştirmek veya paket içine kanca yöneticisi gibi olun.

Yani, which kullanmayın. Bu kullanımı yerine:

$ command -v foo >/dev/null 2>&1 || { echo >&2 "I require foo but it's not installed.  Aborting."; exit 1; }
$ type foo >/dev/null 2>&1 || { echo >&2 "I require foo but it's not installed.  Aborting."; exit 1; }
$ hash foo 2>/dev/null || { echo >&2 "I require foo but it's not installed.  Aborting."; exit 1; }

(küçük bir dip not: bazı 2>&- 14* *ama kısa aynı - bu doğru değil önerecektir. 2>&- bir neden FD 2 kapatırhatabaşarılı bir yazı çok farklı olan stderr, yazmaya çalıştığında, program ve çıkış (ve tehlikeli!) atarak)

Eğer denetim bang /bin/sh ise POSIX ne dediği umurunuzda olmalı. type hash'In çıkış kodları değil çok iyi tanımlanan POSIX ve hash görülen çıkmak başarıyla zaman komut yok (hiç görmedim bu type henüz). command'In çıkış durumu muhtemelen kullanmak için güvenli olduğunu, böylece POSIX tarafından tanımlanan.

Eğer komut dosyası bash gerçi kullanıyorsa, POSIX kuralları artık hiç önemli değil ve type hash hem gayet güvenli olur. type bir -P arama PATH hash yan etkisi bu komut konumu olacak karma (Hızlı Arama Bir dahaki sefere), genellikle iyi bir şey bu yana muhtemelen kontrol için kendi varlığı için aslında.

Basit bir örnek olarak, burada, aksi takdirde date varsa gdate çalışan bir fonksiyon

gnudate() {
    if hash gdate 2>/dev/null; then
        gdate "$@"
    else
        date "$@"
    fi
}

Özet olarak:

bash shell/hashbang olduğu, sürekli ** 33 (komutları için) veya type (built-ins düşünün ve anahtar kelimeler kullanın.

POSIX bir senaryo yazarken command -v kullanın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Blue Lightning TV

    Blue Lightni

    9 EKİM 2011
  • Jason Rosolowski

    Jason Rosolo

    25 EKİM 2006
  • xdadevelopers

    xdadeveloper

    25 Aralık 2009