2011/02/12
シェルスクリプト自身のパス取得
シェルスクリプトを作成していて、
たまにスクリプト自身のパスを取得したい場合がある。
以下の処理でシェルの種類に依存せず(とは言っても bourne shell 系のみだが)
シェルスクリプト自身のパスを取得する事ができる筈(多分)。
PATH 環境変数に従って実行された場合は
${0} にスクリプトの絶対パスが格納されているので
${0} の dirname (1) を取得すれば良いが、
相対パス指定で実行された場合は 1度 cd (1) した上で
pwd (1) を実行してカレントディレクトリを取得する必要がある。
すべてのケースで
"( cd ${0%/*} `dirname ${0}` && pwd )"
しても同じ結果を得られるのだが、
サブシェルの実行や特に pwd (1) の実行はシステムに負荷をかけるので、
効率を考え ${0} の値を確認している。
expr (1) の実行も結構負荷がかかるからあまり意味ないかな…
1#!/bin/sh 2# ${0} の dirname を取得 3# cwd=${0%/*} 4cwd=`dirname ${0}` 5 6# ${0} が 相対パスの場合は cd して pwd を取得 7expr ${0} : "/.*" > /dev/null || cwd=`(cd ${cwd} && pwd)` 8 :
2011/03/17 追記
$ sh fooこの様に実行された場合 ${0} には foo が 格納されているので ${0%/*} では foo に展開されてしまい cd (1) がエラーとなる問題があったので、 dirname (1) を利用する様修正しました。