- ベストアンサー
shシェルで実行パスではなくファイルのパスを取得する方法
pwdコマンドで、実行パスを取得する事は可能ですが、このパスはどこから呼び出されたかによって変化します。 そうではなく、どこから呼ばれても、そのSHファイルのパスを取得する方法を教えてください。 <例:ディレクトリ> dir_a/ | +-dir_b/ | +-pgm_a.sh <例:シェル> ##### pgm_a.sh ##### #!/bin/sh echo `pwd` ##### pgm_a.sh ##### <例:コマンド> > pwd dir_a > ./dir_b/pgm_a.sh dir_a > cd ./dir_b > ./pgm_a.sh dir_a/dir_b どこから呼ばれても、常にpgm_a.shのパスである。 「dir_a/dir_b/」を取得できるコマンドが知りたいです。 あるいはシステム変数のようなものでも構いません。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
スクリプト内の$0変数が、スクリプト自身の名称になっています。 1.この例では、$0は、dir_a/dir_b/pgm_a.sh となっています。 2.但し、このスクリプトが相対パス名で呼ばれた場合は、 ./pgm_a.shのようになっているときもあります。 1のケースでは、絶対パスなので、最後の/以降を削除したものが、パス名になります。 2のケースでは、相対パスなので、pwdコマンドでカレントパスを求めて、それと$0を合わせてからパス名を求めます。 1の場合は、$0の先頭が/から開始しています。 2の場合は、上記以外の場合です。
その他の回答 (1)
- notnot
- ベストアンサー率47% (4900/10358)
case "$0" in /*) A=`dirname "$0"` ;; *) A=`dirname "$PWD/$0"` ;; esac echo $A dirname コマンドが無い場合は、シェルがbashだとして、その前で、 dirname() { echo ${1%/*}; } と定義してください。
お礼
ありがとう御座います。
補足
なるほど、以下のような感じですか? (1)判定($0の頭1桁が"/") Yes ワーク_フルパスファイル名←`pwd` No ワーク_フルパスファイル名←$0 [連結演算子] "/" [連結演算子] `pwd` (2)ワーク_フルパスファイル名の中の一番右側の"/"以降をカット 理屈は理解できました。。 しかし、 $0の頭1桁が"/"かどうか判定する術も、 一番右側の"/"以降をカットする術も、 初心者の私には高いハードルです。 何か良い方法はありませんか。