深酒とお昼寝で忘れる

深酒とお昼寝で忘れる

素面でも意図したことを忘れがちなしらふいとさんは、忘れる前に書き残せたらとても満足

Bash シェルスクリプトの絶対パスが、そのスクリプトの中からでも分かりますか

分かります。どう書くかを知っていると意外と便利なこの質問は Stack Overflow の こちら です。最も upvote されている回答のワンライナーは下記のとおりです。

"$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

ただし回答にも書かれているとおりこのワンライナーには少々問題があり、ファイルがシンボリックリンクだと解決できません(ディレクトリがシンボリックリンクの場合は cdcd -P にすることで解決されます。pwdpwd -P にしても同様だと思います)。回答ではさらにこの問題に対応できる、7行からなるコードも紹介されていますが(興味のある方は こちら)ふだん使いするには少し複雑すぎる気がします。

そこで、コメントにちらほら書かれていたり 紹介されている Gist にもあるように、

"$(dirname "$(readlink -f "$0")")"

がシンプルかつ十分な書き方です。……ただしこのワンライナーにも問題があり、Linux など GNUreadlink がインストールされている環境でしか動きません。

Mac を使っている場合は、たとえば Homebrewcoreutils パッケージをインストールして greadlinkreadlink の代わりに使うか、ファイルのシンボリックリンクの解決は諦めて(ほとんどのユースケースでは事足りると思います)上の BASH_SOURCE を用いた書き方を使うことになるでしょう。

覚えておいて損はないのではないでしょうか。