it-swarm-id.com

Dapatkan jalur skrip saat ini ketika dijalankan melalui symlink

Saya memiliki utilitas yang terdiri dari beberapa direktori dengan beberapa skrip bash dan file pendukung yang akan digunakan untuk beberapa mesin di direktori yang berbeda di setiap mesin. Script harus dapat mereferensikan path relatif ke diri mereka sendiri jadi saya harus bisa mendapatkan path ke file yang saat ini sedang dieksekusi.

Saya sadar akan dirname $0 idiom yang bekerja dengan sempurna ketika skrip saya dipanggil langsung. Sayangnya ada keinginan untuk dapat membuat symlink ke skrip ini dari direktori yang sama sekali berbeda dan masih memiliki pekerjaan logika pathing relatif.

Contoh dari keseluruhan struktur driectory adalah sebagai berikut:

/
 |-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)

Bagaimana saya bisa dengan andal mereferensikan /usr/local/lib/foo/res/resource_file.txt dari script.sh apakah itu dipanggil oleh /usr/local/lib/foo/bin/script.sh atau ~mike/bin/link_to_script?

59
Mike Deck

Coba ini sebagai solusi tujuan umum:

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

Dalam kasus spesifik symlink berikut, Anda juga bisa melakukan ini:

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

satu baris:

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

readlink -f tidak berfungsi untuk saya, saya memiliki kesalahan ini:

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

Tapi ini bekerja dengan baik:

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

Satu tambahan kecil untuk skrip di atas. Opsi -P untuk pwd mengikuti symlink

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