bashで自分のファイル名をとる
bashのスクリプトで自分自身のファイル名を取得するときは
BASH_SOURCE[0]
をつかう。
sample1.sh
#/bin/bash . $(dirname $0)/sample2.sh function f1 { f2 } f1
sample2.sh
#!/bin/bash function f2 { echo $0 basename ${BASH_SOURCE[0]} }
sample1.shを実行すると、f2の$0
には sample1.shが、
${BASH_SOURCE[0]}にはsample2.shが設定されている
ファイル名を取得するときに basename
をつかわないで
${BASH_SOURCE[0]##*/}
としてもファイル名だけが取得できる。
(先頭から*/と一致する部分を削除するので、ファイル名のみになる)
ディレクトリパスはdirname
以外の簡単な方法は思いつかない。
${BASH_SOURCE[0]%%${BASH_SOURCE[0]##*/}}
で取得できるけど
これならdirname
のほうが良い。
(後方からファイル名と一致する部分を削除するのでディレクトリパスになる)
ディレクトリの絶対パスを取得するときはこんな感じ。
$(cd -- $(dirname -- ${BASH_SOURCE[0]}) && pwd -P)
cdしてpwdしてディレクトリパスを取得する。
--
はディレクトリ名の先頭が-
でも良いようにつけている。
(先頭が - だとコマンドのオプションと判断されてしまうため)
pwdに-Pオプションをつけると、シンボリックリンクではなく、
実際のパスが表示される。