it-swarm-tr.com

Symlink aracılığıyla yürütüldüğünde geçerli komut dosyasının yolunu alma

Bazı bash komut dosyaları ve muhtemelen her makinede farklı bir dizinde birkaç makineye dağıtılacak destek dosyaları ile birkaç dizin oluşan bir yardımcı program var. Komut dosyaları kendilerine göre yolları başvurmak gerekir, bu yüzden şu anda yürütülmekte olan dosyanın yolunu almak gerekir.

Komut dosyam doğrudan çağrıldığında mükemmel çalışan dirname $0 Deyiminin farkındayım. Ne yazık ki, tamamen farklı bir dizinden bu komut dosyalarına sembolik linkler oluşturma ve yine de göreli yollama mantığına sahip olma arzusu vardır.

Genel yol yapısının bir örneği aşağıdaki gibidir:

/
 |-usr/local/lib
 |  |-foo
 |  |  |-bin
 |  |  |  |-script.sh
 |  |  |-res
 |  |  |  |-resource_file.txt
 |-home/mike/bin
 |  |-link_to_script (symlink to /usr/local/lib/foo/bin/script.sh)

/usr/local/lib/foo/res/resource_file.txt Veya script.sh Tarafından çağrılmış olsun, /usr/local/lib/foo/bin/script.sh 'Dan ~mike/bin/link_to_script Nasıl güvenilir bir şekilde başvurabilirim?

59
Mike Deck

Bunu genel amaçlı bir çözüm olarak deneyin:

DIR="$(cd "$(dirname "$0")" && pwd)"

Aşağıdaki sembolik bağlantıların özel durumunda, bunu da yapabilirsiniz:

DIR="$(dirname "$(readlink -f "$0")")"
83
Caleb

tek çizgi:

cd $(dirname $([ -L $0 ] && readlink -f $0 || echo $0))
8
diyism

readlink -f benim için çalışmıyor, bu hatayı aldım:

readlink: illegal option -- f
usage: readlink [-n] [file ...]

Ama bu iyi çalışıyor:

DIR="$(dirname "$(readlink "$0")")"
echo $DIR
4
Kevin Campion

Yukarıdaki betiğe küçük bir ekleme. Pwd için -P seçeneği sembolik bağlantıları takip eder

DIR="$(cd "$(dirname "$0")" && pwd -P)"
0
user2108420