bash>=3 の場合 次の作品:
$ ./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
スクリプトをソースするときに正しい答えが得られます。
ただし、これにはパスが含まれているため、スクリプトのファイル名のみを取得するには、次を使用します:
$(basename $BASH_SOURCE)
me=`basename "$0"`
シンボリック リンクを読み取る場合、これは通常、希望するものではありません (通常、この方法でユーザーを混乱させたくありません)。
me="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")"
IMO、それは紛らわしい出力を生成します。 「foo.sh を実行したのに、bar.sh を実行していると表示される!? バグに違いない!」さらに、異なる名前のシンボリック リンクを持つ目的の 1 つは、それが呼ばれる名前に基づいて異なる機能を提供することです (一部のプラットフォームでは gzip と gunzip を考えてください)。
つまり、ユーザーが foo.sh
を実行したときにシンボリック リンクを解決するには これは実際には bar.sh
へのシンボリックリンクです 、解決された名前 bar.sh
を使用したい foo.sh
ではなく .