シェルスクリプトで相対パスと絶対パスを取得する方法です。
相対パスを取得する
シェルスクリプトでディレクトリの相対パスを取得するには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された状態で実行していく ...