bashスクリプトの位置を取得する
bashスクリプトをプロジェクトルートを起点として走らせたいことがある。 そこで、bashスクリプトが格納されている絶対パスをとりたくなるが、これは次のようすると取れる。
SCRIPT_PATH="$( cd "$( dirname "$( readlink -f "$BASH_SOURCE" )" )" >/dev/null 2>&1 && pwd )"
解説
$BASH_SOURCE
でbashスクリプトの実体へのパスがとれる。
しかし、$BASH_SOURCE
はシンボリックリンクの解決が行われていない状態のパスが入っているので、readlink
コマンドで解決させている。
ただ、これでも不十分で、パスの間に挟まっているシンボリックリンクも解決する必要がある。そこで、readlink
に-f
を指定して、階層の途中にあるシンボリックリンクも全部解決してもらっている。
これはGNU Core Utilitiesで利用できるがMacでは利用できない。
readlinkを再帰的にするような関数を自前で実装するか、GNU Core utilitiesをインストールするなどしなければならない。
最後に、直したパスからdirname
コマンドでbashスクリプト名を剥がし、そのディレクトリへ移動してpwd
すると絶対パスが得られる。