

シェルスクリプトから自分のいるディレクトリを取得する
この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。
シェルスクリプトの中から「自分自身が置かれているディレクトリ」を取得したいことがある。カレントディレクトリではなく、スクリプトファイル自体の場所。
やり方はこう。
#!/bin/shcd `dirname $0`pwd$0 にはスクリプト自身のパスが入っているので、dirname でディレクトリ部分だけ取り出し、そこに cd してから pwd すれば絶対パスが得られる。
実際に試すとこうなる。
$ cd /$ /path/to/example.sh/path/to
$ cd /path/to$ ./example.sh/path/toどちらの呼び方でも /path/to が返ってくる。呼び出し元のカレントディレクトリが / でも /path/to でも関係ない、というのがポイント。
仕組み
/path/to/example.shとして実行した場合:$0は/path/to/example.sh→dirnameすると/path/to→cd /path/to→pwdは/path/to/path/toにcdしてから./example.shとして実行した場合:$0は./example.sh→dirnameすると.→cd .は実質何もしない →pwdはそのままカレントディレクトリの絶対パスである/path/to
dirname と basename は単体だとこう動く。
$ dirname /path/to/example.sh/path/to
$ basename /path/to/example.shexample.shdirname はディレクトリ部分、basename はファイル名部分を取り出す。組み合わせてパスを分解するのによく使う。
注意点
普段の「相対パスか絶対パスで直接叩く」使い方なら上記で十分だが、以下のケースでは期待通りにならないことがある。
- シンボリックリンク経由で実行した場合、リンク自体のディレクトリが返る。実体のあるディレクトリが欲しいなら
readlink -fなどで解決する必要がある PATHを通していて単にexample.shとだけ打って実行した場合、$0はパスなしのexample.shになりdirnameは.を返すが、それがスクリプトの実際の置き場所とは限らない