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) を利用する様修正しました。


Copyright © 2008-2020 Mitzyuki IMAIZUMI. All rights reserved.