シェルスクリプトが置かれているパスを取得する - Linux シェルスクリプト プログラミング

PROGRAM


シェルスクリプトが置かれているパスを取得する

Linux の sh シェルでスクリプトを実行した時、カレントディレクトリはコマンドを実行した時のディレクトリになっています。

このため、実行する位置によってカレントディレクトリが変化するので、このままだと相対パスを指定してスクリプトをインポートすることが困難です。

 

そこで、シェルスクリプトでファイル名や拡張子名を取得する でお話した方法を応用して、スクリプトの起動コマンドが格納される特殊変数 "$0" を使って、スクリプトが保存されているパスを取得してみます。

CURRENTDIR=${0%/*}

基本的にはこのようにして、スクリプトの実行パスを取得することができました。

 

ただし、これを使うときには、次の 2 つの点に注意する必要がありそうです。

インクルードされるファイル内では使えない

ひとつ目は、スクリプトの中で "." コマンドを使ってインクルードしたファイル内では使えないところです。

そもそも "." コマンドは、それを記載したスクリプトにこのコマンドで指定したテキストファイルの内容を流し込むものなので、あくまでも "$0" 変数では実行したコマンド名が取得されます。

そのため、インクルード先でそれを使っても、元のスクリプトの実行パスが取得されてしまいます。

スクリプト実行時に必ずパスを指定すること

もうひとつは、スクリプトをパス情報なく呼び出したときに、パスではなくファイル名が取得できてしまうところです。

実行権限を付けたスクリプトファイルであれば "./test.sh" のように、最低でもカレントパスが記載されるので問題ないのですが、"sh test.sh" のようにシェルコマンドを使ってスクリプトを実行した場合、ファイル名だけで呼び出せることになります。

 

そうなると、保存パスがファイル名になってしまって "test.sh/" というようなパスが取得できてしまいます。

これを避けるためには、スクリプト内でパス情報があるかを判定する方法もあるかもしれませんが、複雑になってしまいそうなので、必ず "./test.sh" で実行するか、または "sh ./test.sh" というようにして実行するようにルールで決めておくのも有用です。

 

取得したパスの使い方

このようにして取得したパスには、末尾に "/" は含まれていません。

そのため、たとえばそこから先の "modules/common.sh" をインクルードしたい場合は、ドットコマンドを使って次のように記載できます。

. "${CURRENTDIR}/modules/settings.h"

また、".." を使えばひとつ前のディレクトリに戻ることもできるので、たとえばそこからひとつ手前の "conf/settings.sh" をインクルードしたい場合は次のようになります。

. "${CURRENTDIR}/../conf/settings.h"

このように、実行したスクリプトファイルが置かれているパスからの任意のパスへ簡単に辿ることができます。


[ もどる ]