The dirname
perintah yang paling dasar, hanya parsing jalan sampai ke nama file off dari $0
variabel (nama script):
dirname "$0"
Tetapi, seperti ditunjukkan matt b , path yang dikembalikan berbeda tergantung pada bagaimana script dipanggil. pwd
tidak melakukan pekerjaan karena itu hanya memberi tahu Anda apa direktori saat ini, bukan direktori tempat skrip berada. Selain itu, jika tautan simbolis ke skrip dijalankan, Anda akan mendapatkan jalur (mungkin relatif) untuk tempat tautan berada, bukan skrip yang sebenarnya.
Beberapa orang lain telah menyebutkan readlink
perintah, tetapi yang paling sederhana, Anda dapat menggunakan:
dirname "$(readlink -f "$0")"
readlink
akan menyelesaikan jalur skrip ke jalur absolut dari root filesystem. Jadi, setiap jalur yang mengandung titik tunggal atau ganda, tilde dan / atau tautan simbolik akan diselesaikan ke jalur penuh.
Berikut adalah script menunjukkan masing-masing, whatdir.sh
:
#!/bin/bash
echo "pwd: `pwd`"
echo "\$0: $0"
echo "basename: `basename $0`"
echo "dirname: `dirname $0`"
echo "dirname/readlink: $(dirname $(readlink -f $0))"
Menjalankan skrip ini di direktori home saya, menggunakan jalur relatif:
>>>$ ./whatdir.sh
pwd: /Users/phatblat
$0: ./whatdir.sh
basename: whatdir.sh
dirname: .
dirname/readlink: /Users/phatblat
Sekali lagi, tetapi menggunakan path lengkap ke skrip:
>>>$ /Users/phatblat/whatdir.sh
pwd: /Users/phatblat
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
Sekarang mengubah direktori:
>>>$ cd /tmp
>>>$ ~/whatdir.sh
pwd: /tmp
$0: /Users/phatblat/whatdir.sh
basename: whatdir.sh
dirname: /Users/phatblat
dirname/readlink: /Users/phatblat
Dan akhirnya menggunakan tautan simbolis untuk menjalankan skrip:
>>>$ ln -s ~/whatdir.sh whatdirlink.sh
>>>$ ./whatdirlink.sh
pwd: /tmp
$0: ./whatdirlink.sh
basename: whatdirlink.sh
dirname: .
dirname/readlink: /Users/phatblat
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd && echo x)"
- dan menghapusnya tanpa substitusi perintah -DIR="${DIR%x}"
.