• ベストアンサー

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/」を取得できるコマンドが知りたいです。 あるいはシステム変数のようなものでも構いません。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

スクリプト内の$0変数が、スクリプト自身の名称になっています。 1.この例では、$0は、dir_a/dir_b/pgm_a.sh となっています。 2.但し、このスクリプトが相対パス名で呼ばれた場合は、 ./pgm_a.shのようになっているときもあります。 1のケースでは、絶対パスなので、最後の/以降を削除したものが、パス名になります。 2のケースでは、相対パスなので、pwdコマンドでカレントパスを求めて、それと$0を合わせてからパス名を求めます。 1の場合は、$0の先頭が/から開始しています。 2の場合は、上記以外の場合です。

webuser
質問者

お礼

ありがとう御座います。

webuser
質問者

補足

なるほど、以下のような感じですか? (1)判定($0の頭1桁が"/")  Yes   ワーク_フルパスファイル名←`pwd`  No   ワーク_フルパスファイル名←$0 [連結演算子] "/" [連結演算子] `pwd` (2)ワーク_フルパスファイル名の中の一番右側の"/"以降をカット 理屈は理解できました。。 しかし、 $0の頭1桁が"/"かどうか判定する術も、 一番右側の"/"以降をカットする術も、 初心者の私には高いハードルです。 何か良い方法はありませんか。

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4900/10357)
回答No.2

case "$0" in /*) A=`dirname "$0"` ;; *) A=`dirname "$PWD/$0"` ;; esac echo $A dirname コマンドが無い場合は、シェルがbashだとして、その前で、 dirname() { echo ${1%/*}; } と定義してください。

関連するQ&A

専門家に質問してみよう