Komut dosyasını yürütmeye göre bir dosyaya atıfta bulunma


97

Yazdığım bir bash betiğinde source, bir yapılandırma dosyasına tanımlanan değişkeni dahil etmek için kullanıyorum . Çalıştırılacak komut act.shdosyası, sourced olacak komut dosyası olduğu halde act.conf.sh, act.shbende:

source act.conf.sh

Bununla birlikte, bu sadece act.shonu içeren dizinde çalışırken işe yarar , çünkü act.conf.shçalışma dizini altına yerleştirilen dosyaya atıfta bulunur. Yürütme betiğine göre dosyaya başvurmadan başvurmak için bir çözüm var mı cd? Teşekkürler.

Yanıtlar:


121

Bakınız: BASH SSS girdisi 28: "Komut dizimin konumunu nasıl belirlerim? Bazı yapılandırma dosyalarını aynı yerden okumak istiyorum."

Herhangi bir çözüm her zaman işe yaramayacaktır:

Genel durumda, bu sorunun çözümü olmadığının farkına varmak önemlidir. Duymuş olabileceğiniz herhangi bir yaklaşım ve aşağıda detaylandırılacak olan herhangi bir yaklaşımın kusurları vardır ve yalnızca belirli durumlarda işe yarayacaktır. Birincisi ve en önemlisi, betiğinizin konumuna bağlı kalmayarak sorunu tamamen önlemeye çalışın!

Çok yeniden kullanılabilir bir araç yazmanız gerekiyorsa , betiğinize parametre olarak doğru yolu seçmek en güvenilir yöntem olacaktır. .

Komut dosyanızın yalnızca belirli kabuklardan çalıştırılacağını ve yalnızca biraz esnekliğin gerekli olduğunu varsayarsak, muhtemelen bu paranoyayı biraz gevşetebilirsiniz. Yine de seçeneklerinize bakmak güzel. İnsanların kullandığı, özellikle sorunlu olan yaygın modeller vardır.

Özellikle, SSS çok yaygın olarak kullanılan $0değişkenden kaçınmanızı önerir :

Okuyan hiçbir şey $0kurşun geçirmez olmayacaktır çünkü $0kendisi güvenilmezdir.

Alternatif olarak $BASH_SOURCEbunun yerine kullanabilirsiniz . Bunun gibi bir şey:

source "${BASH_SOURCE%/*}/act.conf.sh"

Bu çözüme yönelik bazı uyarılar da var. Farklı çözümler arasındaki değiş tokuşları görmek için SSS sayfasına bakın. Düzgün bir şekilde genişlemediğinde kullanışlı bir hata durumu elde ettiğiniz için, sizin için çalışacağı durumlarda cdbirlikte tavsiye ediyor gibi görünüyorlar $BASH_SOURCE.


1
Teşekkürler, kullanırdım readlink. Aranacak anahtar kelimeleri belirleyemedi, bu yüzden soruyu burada yayınladı ....
Ryan Li

9
Bash SSS'nin çökmesi durumunda ilgili bilgiyi cevaba çekebilir misin?
Merlyn Morgan-Graham

3
Link şunu öneriyor:, cd "${BASH_SOURCE%/*}" || exitveya read somevar < "${BASH_SOURCE%/*}/etc/somefile"Link Kesinlikle Cesaretini Kırmıyor $0 "$ 0 yazan hiçbir şey kurşun geçirmez olamaz, çünkü $ 0'ın kendisi güvenilmezdir."
ThorSummoner

10
BASH_SOURCE sonrasındaki% / * ne yapıyor ve nasıl?
Silicomancer



5

Takip etmeyi dene:

source ${BASH_SOURCE[0]/%act.sh/act.conf.sh}

1

Genelde bunu senaryomun üstüne eklerim.

cd $(dirname $BASH_SOURCE)

Ardından, sonraki tüm kodlar bu komut dosyası yoluna göre çalıştırılır.

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.