Bash シェルスクリプトの絶対パスが、そのスクリプトの中からでも分かりますか
分かります。どう書くかを知っていると意外と便利なこの質問は Stack Overflow の こちら です。最も upvote されている回答のワンライナーは下記のとおりです。
"$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ただし回答にも書かれているとおりこのワンライナーには少々問題があり、ファイルがシンボリックリンクだと解決できません(ディレクトリがシンボリックリンクの場合は cd
を cd -P
にすることで解決されます。pwd
を pwd -P
にしても同様だと思います)。回答ではさらにこの問題に対応できる、7行からなるコードも紹介されていますが(興味のある方は こちら)ふだん使いするには少し複雑すぎる気がします。
そこで、コメントにちらほら書かれていたり 紹介されている Gist にもあるように、
"$(dirname "$(readlink -f "$0")")"
がシンプルかつ十分な書き方です。……ただしこのワンライナーにも問題があり、Linux など GNU の readlink
がインストールされている環境でしか動きません。
Mac を使っている場合は、たとえば Homebrew
で coreutils
パッケージをインストールして greadlink
を readlink
の代わりに使うか、ファイルのシンボリックリンクの解決は諦めて(ほとんどのユースケースでは事足りると思います)上の BASH_SOURCE
を用いた書き方を使うことになるでしょう。
覚えておいて損はないのではないでしょうか。