• ベストアンサー

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% (4844/10253)
回答No.2

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

関連するQ&A

  • シェルスクリプトでの絶対パスの取得

    UNIXのシェルスクリプトで、引数として渡された相対パスから絶対パスを取得するには、そうすればよいでしょうか。 cd 相対パス 変数=`pwd` これが一番普通のやり方でしょうか。 change directory しなくてもできる方法がないのかなあと思ったもので。

  • Linuxでシェルスクリプトがフルパスだと実行できない

    Linuxでシェルスクリプトがフルパスだと実行できない こんにちは 現在linuxでシェルスクリプトを記載していて、やっと出来た!と思ったら、なぜかフルパスで実行すると失敗します。 中身は例えば #!bin/sh echo "hello" とし、ファイル名をtest.shとします。 実行時にカレントからだと上手くいきます。 ./test.sh ただし、フルパスで実行するとうまくいきません。 ./home/user/test.sh エラーは以下 bash: ./home/dv3/tet.sh:No such file or directory 所有者はrootでグループもrootにしてあります。 シェルの権限は755にして、rootで実行しています。 なぜカレントだと上手くいき、フルパスだと上手くいかないのでしょうか? パスが必要なコマンドも入っていないのに。。。 どなたかご教授いただけると幸いです。 宜しくお願い致します。

  • シェルでコマンドの実行結果を変数に格納する方法

    以下のようなコマンドライン引数を取得するシェルを書いたのですが 実行時にエラーになってしまいました。コマンド(第2引数以降を取得するコマンド)の実行結果を変数に格納するところでエラーになってしまいました。どのようにすればよろしいでしょうか。 「./test2.sh a b c d e」を実行し「a: コマンドが見つかりません」 というエラーが出てしまいます。 (test2.shの内容) #!/bin/sh OUTPUTFILE=$1 SRC_FILES=`"$@" | cut -d ' ' -f 2-` # 第二引数以降を取得 echo $OUTPUTFILE ←ここは表示される echo $SRC_FILES ←ここでエラー

  • bシェルで実行シェルIDの取得について

    bシェルとして作成されているシェルを仮にa.shとします。 echoで、”a.sh 実行開始”のようなメッセージを表示させたいのですが、 シェルID(a.sh)を取得する事は可能でしょうか?

  • 実行ファイルのパスを取得したい

    C言語で自分自身がどのディレクトリに存在しているか 知りたいのです。 簡単に例を挙げて説明します。 UNIX C言語で cmd1 という実行ファイルを作成しました。 環境変数は以下のように定義されていたとします。 PATH=/bin:/usr/bin /binにcmd1を配置してカレントディレクトリ/homeにおいて cmd1を実行、cmd1プログラム内で"/bin/cmd1" を取得したいのです。 続けて、/bin/cmd1を/usr/bin/cmd1移動して、cmd1を実行すれば、 プログラム内で"/usr/bin/cmd1"を取得できるコーディングをしたいのです。 typeコマンドのような事をC言語で行いたいのですが。 お分かりの方いらっしゃいましたら教えてください。 よろしくお願いします。

  • sedコマンドをシェルで実行でうまくいかない

    sedコマンドをシェルで実行しようとしています。 sedコマンドの引数がシングルクォートのためうまく出来ずに困っています。 テキスト内の /abc を xxx と変えたいとします。 以下のように作ってみました。 #!/bin/sh a='\/abc' b=xxx sed \'$a/$b\' txt しかし 認識できないコマンドです: '\/abc/xxx' というエラーが出ます。 $aで扱いたい変数は実はもっと長いパスの為、 ぜひ変数を使いたいのですが、うまくやる方法は無いでしょうか。

  • シェルスクリプト実行で”そのようなファイルやディレクトリはありません”と出ます。

    以下の単純なシェルスクリプトを実行しようとしています。 ------------------- #!/bin/sh echo ok ------------------- そのとき、 bad interpreter: そのようなファイルやディレクトリはありません と出てしまいます。 ・which sh で確認すると /bin/sh です。 ・Windowsで作ったファイルをFTPのアスキーモードで転送しています。 (ものすごく単純なミスをしてるのかもしれませんが、) よろしくお願いします。

  • シェルの実行ファイル位置の取得

    sh実行時に絶対パスで指定するのですが、その実行したshのディレクトリは取得できないのでしょうか。 実行した後にそのパスを利用してシェル位置まで移動したいです。 /home/user/xxxxx/yyyyy/zzzzz/aaa.sh ↑をどこの場所で実行しても実行後には /home/user/xxxxx/yyyyy/zzzzz/の位置に移動をしていたいのですが、 シェル内で/home/user/xxxxx/yyyyy/zzzzz/を取得する事は可能でしょうか。

  • シェルスクリプトファイルからjavaを実行したい

    シェルスクリプトファイル(拡張子が.shのファイル)からJavaを実行したいのですが上手くいきません。 コマンドラインで直接 cd javaのファイルが置いてあるディレクトリへのフルパス を実行した後 java 実行するクラス名 引数 とすると上手く動きます。 上記2行をshファイルにコピペしてみましたが、エラーになり動きません。 エラーは : No such file or directory cdをしている行とcdで移動しようとしているディレクトリパス Exception in thread "main" java.lang.NoClassDefFoundError: 実行するクラス shファイルの1行目に #!/bin/sh や #!/bin/bash を入れてみましたが、どちらも挙動が変わりません。(エラーのまま) shファイルはUTF-8を文字コードにして改行はLFのみです。 また、javaコマンドを実行するとき -cp や -classpath 引数でjavaのファイルが有るディレクトリを指定してみましたが挙動が変わりません。 shの実行はコマンドラインから sh shファイル(絶対パスで) source shファイル(絶対パスで) でやってみましたが駄目でした。 javaのファイルが有るディレクトリに対してパスを貼ってみましたが挙動が変わりません。 コマンドラインからコピペしてshファイルを作っていますので、フォルダ名等のつづりミスの可能性は低いと思います。 何か設定が足りないのでしょうか? よろしくお願いいたします。

  • sudoでシェルスクリプトを実行させたい

    /usr/bin/sudo を使って、xxx.shを実行させたいので、設定でxxx.shを許可しました。 その後Apacheで動くCGI(perlスクリプト)から、``を使って実行させようと考えています。 このときにこのxxx.shがうまく動きません。多分シェルにアクセスできないのだと思いますが、どうしたらこのスクリプトをroot権限で動かす事ができるようになるのでしょうか。関係あるかどうかわかりませんが、xxx.shの中身はディレクトリ作成コマンドなどです。ネットで検索したら、シェルスクリプトだけ許可にすればよいとあったのですが・・。セキュリティ的には/bin/shを許可するのはまずそうな気がするのですが、こちらを許可してもよいものでしょうか。 環境等 xxx.sh 755 所有者(user1) Apache実行ユーザ (apache) CGIの実行ユーザ(apache?) 挑戦したコマンド(とアパッチのログ) `/usr/bin/sudo sh ./xxx.sh`; ->パスワード求められます (/bin/shの権限がない?) `/usr/bin/sudo ./xxx.sh`; ->/usr/bin/sudo: unable to exec ファイルのパス No such file or directory (xxx.shのファイルの場所はあってます) `/usr/bin/sudo フルパス/xxx.sh`; ->/usr/bin/sudo: unable to exec ファイルのパス No such file or directory (xxx.shのファイルの場所はあってます) 不足の点などあればご指摘ください。