Bagaimana menjalankan skrip dari jalur lain, dan mengetahui jalur skrip?

8

Saya perlu menjalankan skrip yang mengakses file di jalur yang sama dengan lokasinya.

Sebagai contoh: Saya memiliki skrip /home/me/folder/script.sh, dan skrip ini akan mengakses file /home/me/folder/myfile. Karena file berada di jalur yang sama dengan skrip, saya hanya menggunakan nama myfile, bukan path lengkap.

Tetapi jika saya menjalankannya /tmp/, seperti:

/tmp$ /home/me/folder/script.sh

itu memberi saya:

myfile: No such file or directory

Jadi, bagaimana saya bisa mengatakan dalam skrip bahwa file berada di jalur yang sama dengan skrip itu sendiri?

Tom Brito
sumber
Bisakah Anda menunjukkan apa penggunaan myfile di sini?
Faheem Mitha
@Faheem Mitha: hanyalah skrip lain yang dipanggil oleh script.sh saya.
Tom Brito
Beberapa alasan Anda tidak ingin menggunakan jalur lengkap, atau memindahkan keduanya ke PATH Anda?
Faheem Mitha
1
@Faheem Mitha: Saya ingin dapat memindahkan folder ini dengan skrip ke tempat lain, bahkan mungkin komputer lain, tanpa perlu menulis ulang jalur myfile.
Tom Brito

Jawaban:

8

Bagaimana dengan $(dirname "$0")/myfile?

alex
sumber
9

Anda tidak dapat mengetahui dalam semua keadaan, tetapi seringkali (tidak selalu) ketika Anda menjalankan skrip demi path alih-alih membiarkan pencarian shell $PATH, path ke skrip akan berada $0. Anda kemudian dapat menggunakan dirname "$0"atau ${0%/*}untuk mendapatkan jalur.

geekosaurus
sumber
4

Saya biasanya melakukan sesuatu seperti ini di bagian atas skrip saya:

SCRIPTDIR=$(dirname "$0")

Atau, untuk mendapatkan pathname lengkap ke direktori skrip (bukan pathname relatif):

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

Kemudian hanya referensi di ${SCRIPTDIR}mana diperlukan.

Richard Downer
sumber