Dengan bash>=3 berikut berfungsi:
$ ./s
0 is: ./s
BASH_SOURCE is: ./s
$ . ./s
0 is: bash
BASH_SOURCE is: ./s
$ cat s
#!/bin/bash
printf '$0 is: %s\n$BASH_SOURCE is: %s\n' "$0" "$BASH_SOURCE"
# ------------- SCRIPT ------------- #
#!/bin/bash
echo
echo "# arguments called with ----> ${@} "
echo "# \$1 ----------------------> $1 "
echo "# \$2 ----------------------> $2 "
echo "# path to me ---------------> ${0} "
echo "# parent path --------------> ${0%/*} "
echo "# my name ------------------> ${0##*/} "
echo
exit
# ------------- CALLED ------------- #
# Notice on the next line, the first argument is called within double,
# and single quotes, since it contains two words
$ /misc/shell_scripts/check_root/show_parms.sh "'hello there'" "'william'"
# ------------- RESULTS ------------- #
# arguments called with ---> 'hello there' 'william'
# $1 ----------------------> 'hello there'
# $2 ----------------------> 'william'
# path to me --------------> /misc/shell_scripts/check_root/show_parms.sh
# parent path -------------> /misc/shell_scripts/check_root
# my name -----------------> show_parms.sh
# ------------- END ------------- #
$BASH_SOURCE
memberikan jawaban yang benar saat mengambil skrip.
Namun ini termasuk jalur sehingga untuk mendapatkan nama file skrip saja, gunakan:
$(basename $BASH_SOURCE)
me=`basename "$0"`
Untuk membaca melalui symlink, yang biasanya bukan yang Anda inginkan (biasanya Anda tidak ingin membingungkan pengguna dengan cara ini), cobalah:
me="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")"
IMO, itu akan menghasilkan keluaran yang membingungkan. "Aku menjalankan foo.sh, tapi katanya aku menjalankan bar.sh!? Pasti bug!" Selain itu, salah satu tujuan memiliki symlink dengan nama berbeda adalah untuk menyediakan fungsionalitas berbeda berdasarkan nama namanya (pikirkan gzip dan gunzip pada beberapa platform).
Yaitu, untuk menyelesaikan symlink sedemikian rupa sehingga ketika pengguna mengeksekusi foo.sh
yang sebenarnya merupakan symlink ke bar.sh
, Anda ingin menggunakan nama yang diselesaikan bar.sh
bukan foo.sh
.