SORU
23 Ocak 2011, Pazar


Kendisi tam yolunu almak için bir bash betiği için bir yol güvenilir?

Tam yolu bilmesi gereken bir bash komut dosyası var. Akraba ile biten veya funky görünümlü yollar olmadan bunu genel olarak uyumlu bir yol bulmaya çalışıyorum. Ben sadece bash, sh, csh, vb destek gerekiyor.

Ben şimdiye kadar ne var:

  1. Kabul edilen" adresleri iyi olan dirname $0 ile komut dosyasının yolunu alıyorum ama . döndürebilir "Can a Bash script tell what directory it's stored in? cevap ^em>görecelieğer komut dizinleri değiştirmek ve yolu hala komut dizinine işaret var isterseniz bir sorun olan yol (.). Hala, dirname bulmacanın bir parçası olacak.

  2. Kabul cevabı "Bash script absolute path with OSX"(X belirli, ama cevap ne olursa olsun çalışır) OSverir pend ön $PWD Eğer $0 bağıl görünüyor olmadığını görmek için test etmek için bir işlev. Ama neden hala göreli olarak küçük parçacıklar şeklinde (her ne kadar genel olarak mutlak) - mesela, eğer script t dizin /usr/bin ve sen /usr yazın bin/../bin/t çalıştırmak için (Evet, kıvrık), size sonuna kadar /usr/bin/../bin olarak komut dosyasının dizin yolu. Hangiçalışırama...

  3. readlink çözüm bu gibi görünüyor on this page,:

    # Absolute path to this script. /home/user/bin/foo.sh
    SCRIPT=$(readlink -f $0)
    # Absolute path this script is in. /home/user/bin
    SCRIPTPATH=`dirname $SCRIPT`
    

    Ama readlink değil POSIX ve görünüşe göre çözüm dayanır GNU readlink BSD işe yaramıyor nedense (yok erişmek için bir BSD gibi sistemi kontrol edin).

Yani, bunu yapmanın çeşitli yolları var, ama onlar tüm uyarılar var.

Daha iyi bir yol ne olabilir? "" Anlamına gelir: . daha iyi bir yere

  • Bana mutlak yolu.
  • Alır funky bit bile kıvrık bir şekilde (yukarıda #2 yorum) çağırdı. (E. g., en azından orta canonicalizes yolu.)
  • Kullanır sadece bash-izm veya şeyler hemen hemen belli olmak en popüler tatlar *nix sistemler (GNU/Linux, BSD ve BSD gibi sistemler gibi OS X, vb.).
  • Önler mümkünse harici programlar örneğin, bash ankastre tercih ediyor () çağrılıyor.
  • (Güncellenditeşekkürler başını gidiyor wich) sembolik bağları çözmek zorunda değil (aslında bir nevi onları yalnız bırakmış olmasını tercih ederim, ama bu bir gereklilik değil).

CEVAP
23 Ocak 2011, Pazar


Cevap kendi sorumu (FAQ başına)...

Bu çoğunlukla benim için uygun görünüyor ile geldim işte "" kriterleri: . daha iyi

pushd `dirname $0` > /dev/null
SCRIPTPATH=`pwd`
popd > /dev/null

...ama göbekli ve hantal görünüyor. Başka biri daha iyi bir cevap olur diye umuyorum.

Not ayrıca bu ezoterik durumlar gibi yürütülen bir senaryo değil mi gelen bir dosya erişilebilir bir dosya sistemi (ki gayet Olası), yiyecek ve içecek var (veya herhangi bir diğer cevapları gördüm).

Edit: İkinci satırı değiştirin:

SCRIPTPATH=`pwd -P`

...eğer sembolik bağları çözmek istiyorum. (Ama diğerleri olabilir bilmiyorum.)Yaygın olarak desteklenen -P bayrağı nasıl, bilmiyorum.Dennis Williamson -P, uzun zaman öncesine kadar güvenilir olduğunu aşağıda söyler. :-)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Michael Zhang

    Michael Zhan

    8 EYLÜL 2012
  • TheScorpioTechno

    TheScorpioTe

    15 Aralık 2010
  • thewinekone

    thewinekone

    17 Aralık 2005