バージョン管理された人

subversionで管理されてます

bashスクリプトの位置を取得する

bashスクリプトをプロジェクトルートを起点として走らせたいことがある。 そこで、bashスクリプトが格納されている絶対パスをとりたくなるが、これは次のようすると取れる。

SCRIPT_PATH="$( cd "$( dirname "$( readlink -f  "$BASH_SOURCE" )" )" >/dev/null 2>&1 && pwd )"

解説

$BASH_SOURCEbashスクリプトの実体へのパスがとれる。

しかし、$BASH_SOURCEシンボリックリンクの解決が行われていない状態のパスが入っているので、readlinkコマンドで解決させている。 ただ、これでも不十分で、パスの間に挟まっているシンボリックリンクも解決する必要がある。そこで、readlink-fを指定して、階層の途中にあるシンボリックリンクも全部解決してもらっている。 これはGNU Core Utilitiesで利用できるがMacでは利用できない。 readlinkを再帰的にするような関数を自前で実装するか、GNU Core utilitiesをインストールするなどしなければならない。

最後に、直したパスからdirnameコマンドでbashスクリプト名を剥がし、そのディレクトリへ移動してpwdすると絶対パスが得られる。