シェルスクリプトから自分のいるディレクトリを取得する

  • Shell
  • Bash

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

シェルスクリプトの中から「自分自身が置かれているディレクトリ」を取得したいことがある。カレントディレクトリではなく、スクリプトファイル自体の場所。

やり方はこう。

#!/bin/sh
cd `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.sh
example.sh

dirname はディレクトリ部分、basename はファイル名部分を取り出す。組み合わせてパスを分解するのによく使う。

注意点

普段の「相対パスか絶対パスで直接叩く」使い方なら上記で十分だが、以下のケースでは期待通りにならないことがある。

  • シンボリックリンク経由で実行した場合、リンク自体のディレクトリが返る。実体のあるディレクトリが欲しいなら readlink -f などで解決する必要がある
  • PATH を通していて単に example.sh とだけ打って実行した場合、$0 はパスなしの example.sh になり dirname は . を返すが、それがスクリプトの実際の置き場所とは限らない