Tech エントリー[プログラミング]
シェルスクリプトで実行ファイルのディレクトリを参照する方法
最近「コマンド化」「自動化」に目覚め、シェルスクリプトにハマっている。
第一歩としてはコマンド化なんだけど、これができると cron などで定期実行できるようになるから結果、これが自動化につながる。
っで、今回はこれまでにプログラムしたスクリプトを汎用化したいと思い、試行錯誤している。
シェルスクリプトを実行する際、以下のようにいくつかの参照方法 / 実行方法がある。
/path/to/shell_script(/ ルートから絶対パスで指定)./path/to/shell_script(相対パスで指定)./shell_script(実行ファイルがあるディレクトリに移動して実行)
この前提として、実行したファイルと同一階層に設定ファイルや共通 (共有) 化した外部ファイルなどを配置して汎用化を図っているんだけど、こうした外部ファイルの参照方法が今回の課題だった。
PHP でいうところの dirname(__FILE__)。
マニュアル見ると __DIR__ が PHP 5.3.0 で追加されました、とあるので、実行ファイルのディレクトリ (絶対パス) を知りたいというニーズが高かったのかな。
っで、同じことをシェルスクリプトでやりたかったということで。
以下のあたりを参照して対処コードを書いてみた。
- 浮浪プログラマの始末書:[Unix] シェルスクリプトで自身のいるディレクトリへ移動 (cd file_self_dir)
- [cppll_novice:0767] Re: プログラムが決まったファイルを読み込む場合。 (参照方法のパターン)
- シェルスクリプト・トレーニング 第8回 findコマンドで"検索プラスアルファ"の操作 : デスクトップ - TECH WORLD (dirname の存在)
一つ目の参照先にある、「スクリプト内でディレクトリを移動しちゃえ」という発想は読んだ瞬間は "目から鱗" 的な関心を持った。
[Unix] シェルスクリプトで自身のいるディレクトリへ移動
相対パスで指定した場合、呼び出し側でカレントディレクトリをこのディレクトリに移動してから実行すれば動くのだが、これだと少し使いづらい。かといって絶対パスで指定してしまうと、スクリプトファイルの格納場所を移動する度にスクリプトを変更しなければならなくなる。
PATH環境変数にスクリプトファイルのあるディレクトリを追加すれば、実行可能ファイルについては解決するのだが、環境変数やユーティリティ関数なんかの定義ファイルには対応できない。
そこで、スクリプトの中で、カレントディレクトリを自分のファイルがあるディレクトリに移動するようにしてみた。子プロセス側でいくらカレントディレクトリを変更しても親プロセスには影響がないので問題ないと思う。
浮浪プログラマの始末書
のだけど、コードを改良していくうちにディレクトリを移動しなくても実行ファイルのディレクトリを絶対パスで知る方法はないものかと疑問が湧いてきた。(これについては方法がまだわかっていない。誰か教えて。pwd のソースとか読めばいいのか ?)
以上のような経緯で書いたのが以下のコード。
SELF_DIR=`dirname $0`
cd ${SELF_DIR}
if [ -f ./script.conf ]; then
source ./script.conf
else
echo "ERROR!! ... config file not found."
exit 2
fi
ディレクトリを参照する部分だけど、先の参照ページだと `echo $0 | sed 's;[^/]*$;;'` とかしていて複雑。
dirname なんていう素敵なコマンドがあるのでこちらを活用して正規表現なんてスッ飛ばしているのがミソ。
っで、ここまでできれば cd でディレクトリを移動しなくてもやりようによっては絶対パスを取得できる気がするんだけど ... 。
$0 が実行ファイルの呼び出され方に依存するからダメかな ... ?
cd しちゃえば、後は pwd すれば取り敢えず絶対パスは取得できる。
SELF_DIR=`dirname $0`
cd ${SELF_DIR}
echo "FILE_SELF DIR is: "`pwd`
追記
2008年09月08日
ワンラインで...
例えばシェルスクリプト自身の絶対パスを取得するのは次のようにできます。
echo $(cd $(dirname $0);pwd)
バッククオートだと一時変数に代入しないとできませんが、"$()"を使うとネストが可能なので、一発で取得する事ができます。
ちなみにこれは、相対パスでも絶対パスでもうまく動作します。
ウノウラボ Unoh Labs
コメント (0) トラックバック (1) Atom/RSS
投稿: 2008年08月10日 01:20 / 最終更新: 2008年09月08日 14:04
» BlogD ができるまで - Django でアプリケーション開発 その1
« yum-cron だと /etc/yum.repos.d/CentOS-Base.repo を読まない ?
トラックバック
-
ShellScript
YUU (PukiWiki/TrackBack 0.4)2009年5月29日 20:18 - Table of Contents スクリプトが存在するディレクトリに移動する参考ページ2009-01-25 クォート2009-01-25 シェル...



コメント (投稿する)