web-gelistirme-sc.com

Shell betiğinde göreceli yollar nasıl genişletilir

Bash ..__ komutunu kullanarak linux 2.6'da ortam değişkenlerini ayarlamak için bir komut dosyası yazıyorum.

export SRC_DIR=..
export LIBPATH=${SRC_DIR}/lib

sorun şu ki, $ LIBPATH eko yapmaya çalıştığımda, SRC_DIR'ı tam yola genişletmek yerine "../lib" yazıyor. Senaryoyu/home/x/lib gibi bir şey yazmayı gerçekten isterdim .. /lib. 

UPDATE Betik, SRC_DIR'in betiğin bulunduğu yerden geçerli bir dizini değil betiğin konumundan bir dizin olduğunu değerlendirmelidir.

33
Jimm

Alt Kabuktaki Dizini Değiştir

Mevcut çalışma dizinini değiştirmeden göreceli bir yoldan mutlak yolu almak için kullanabileceğiniz küçük bir numara var. İşin püf noktası, bir alt kabuktaki göreceli yola gitmek ve ardından çalışma dizinini genişletmektir. Örneğin:

export SRC_DIR=$(cd ..; pwd)

Arama Dizini Yerine Komut Dosyasından Göreli Yollar

Geçerli çalışma dizini yerine komut dosyasının konumundan göreceli bir yola geçmek için, bir parametre genişletme veya dirname yardımcı programını kullanabilirsiniz. Ben biraz daha açık olduğundan dirname 'i tercih ederim. İşte iki örnek.

# Using /usr/bin/dirname.
export SRC_DIR=$(cd "$(dirname "$0")/.."; pwd)

# Using the "remove matching suffix pattern" parameter expansion.
export SRC_DIR=$(cd "${0%/*}/.."; pwd)
50
Todd A. Jacobs

readlink komutu yalnızca sembolik bağlantıları çözmeyi değil, aynı zamanda bağıl yolları kanonlaştırmayı da yapabilir. Dikkatli olun, çünkü tüm komut dosyalarınızdaki sembolik bağları çözme davranışını istemeyebilirsiniz. Sembolik linkleri çözmek istemiyorsanız, pwd en iyisi olacaktır; Bir alt kabuk kullanımına dikkat edin, böylece cd komutu ana Shell'deki çalışma dizinini etkilemez.

# The path you want to get information on... (for readability)
your_path=..

# Using /bin/readlink (resolves symlinks)
export SRC_DIR=$(readlink --canonicalize $your_path)

# Using /usr/bin/dirname (keeps symlinks)
export SRC_DIR=$(cd $your_path ; pwd)
12
mbells

Ben genellikle kullanırım

SCRIPT_DIR=$(readlink -f ${0%/*})

Tam yolu betiğe döndürmeli ve hatta yoldaki tüm bağlantıları çözmelidir.

8
choroba

Güzelce bulduğum şeyi eklemek için bu eski iş parçacığını kazmak:

dışa aktarma SRC_DIR = `realpath ..`

burada daha fazla bilgi görmek için:

http://man7.org/linux/man-pages/man3/realpath.3.html

1
Lerring

Bunun yerine şunu yapın:

export SRC_DIR=`pwd`;

Güncelle:

Komut dosyasının dosya sistemindeki konumuna göre yol almak istediğinizden bunu kullanın:

export SRC_DIR=`dirname $0`

Güncelleme2:

Komut dosyanız doğrudan çağrılmalı ve bash /path/to/script.sh veya source foo.sh olarak kullanılmamalıdır. Bir Shebang satırı ekle, yürütme izinleri ekle ve komut dosyasını doğrudan çağır.

0
jman

Hata kodunu saklamak için:

function getPwd() {
    $(cd $1; [[ $? -ne 0 ]] && exit 1 || echo echo $PWD;)
    return $?
}
0
Zeph

Bunu yaptığımda şöyle eko kullanıyorum:

export SRC_DIR=`echo $HOME/bin/`
0