たかまるの雑記

たまに更新

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オプションをつけると、シンボリックリンクではなく、
実際のパスが表示される。