シェルスクリプトで相対パスと絶対パスを取得する

スポンサーリンク

シェルスクリプトで相対パスと絶対パスを取得する方法です。

相対パスを取得する

シェルスクリプトでディレクトリの相対パスを取得するにはdirname $0を使います。

特殊変数の$0には現在実行しているシェルスクリプトの相対パスが格納されて、dirnameコマンドは引数に与えられたファイルのパスから、ディレクトリのパスを取り出します。ちなみにbasenameコマンドは逆にファイル名を取り出してくれます。

例えば以下のシェルスクリプトが/Users/username/dev/work/relative.shにあるとします。

#!/bin/sh

echo $0
echo `dirname $0`
echo `basename $0`

これをホームディレクトリ/Users/usernameから実行すると次の結果になります。

$ sh dev/work/relative.sh
dev/work/test.sh  ← $0 の結果
dev/work  ← dirname $0 の結果
test.sh  ← basename $0 の結果

相対パスで取得されていますね。

絶対パスを取得する

絶対パスを取得する場合、まず思いつくのがpwdコマンドを使うことです。これはカレントディレクトリの絶対パスを取得してくれます。環境変数$PWDでも同じです。

$ pwd
/Users/username
$ echo $PWD
/Users/username

しかし、シェルスクリプトでpwdを使って先程と同じように実行しても絶対パスは取得できません。

#!/bin/sh

echo `pwd`
$ sh dev/work/absolute.sh
/Users/username  ← pwd の結果

ここで実行されるpwdコマンドはシェルを実行したディレクトリのパスを取得するためです。そのため、実行したファイルの絶対パスを取得したい場合は、cd dirname $0が必要となります。

#!/bin/sh

echo $(cd $(dirname $0) && pwd)
$ sh dev/work/absolute.sh
/Users/username/dev/work  ← $(cd $(dirname $0) && pwd)の結果

やってる事は単純でcdを使ってディレクトリを移動した後にpwdで絶対パスを取得しているのですが、$(コマンド)又は`コマンド`のコマンド置換を忘れてはいけません。

コマンド置換はサブシェルで実行されるので元の環境には影響を与えないからです。

#!/bin/sh

echo $(cd $(dirname $0) && pwd)
↓これ以降もcdされてない状態で実行していく
...

cd $(dirname $0)
echo pwd
↓これ以降はcdされた状態で実行していく
...

参考サイト

 Man page of BASH

 シェルスクリプトで親ディレクトリのパスを取得したい | hrendoh's memo