GNU/Linux >> Linux の 問題 >  >> Linux

Bash スクリプトのスクリプト ファイル名を知るにはどうすればよいですか?

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 ではなく .


Linux
  1. Bashスクリプトがエイリアスを認識しないのはなぜですか?

  2. Bashスクリプトをデバッグする方法は?

  3. バッシュ‘?

  1. フォルダから最も古いファイルを削除するためのBashスクリプト?

  2. ターミナルでループバッシュスクリプトを停止する方法は?

  3. 実行する前にシェルスクリプト全体を読む方法は?

  1. Csvファイルの日付の形式を変更するためのBashスクリプトを作成するにはどうすればよいですか?

  2. bash スクリプトが .NET でソースされたときに、インストールされているディレクトリをどのように知ることができますか。オペレーター?

  3. ファイルを bash シェル スクリプトに含める方法