• ベストアンサー

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

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

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

  • ベストアンサー
回答No.1

シェルスクリプト中でスクリプト名は「$0」で取得出来ます。 フルパスで指定しているのなら 「dirname $0」で(ファイル名を取り除いた)ディレクトリ部分が 取り出せます。 >cd /tmp >cat hoge.sh #! /bin/sh echo dirname=`dirname $0` >/tmp/hoge.sh dirname=/tmp >./hoge.sh dirname=. >sh /tmp/hoge.sh dirname=/tmp

langria
質問者

お礼

なるほど$0ですね。 助かりました。ありがとうございます。 教えていただいたことを踏まえてプログラムしていきたいと思います。

その他の回答 (2)

回答No.3

#1です。補足です。 > ↑をどこの場所で実行しても実行後には > /home/user/xxxxx/yyyyy/zzzzz/の位置に移動をしていたいのですが、 スクリプト中でchdir(cd)すれば、 スクリプト内部ではディレクトリ移動出来ますが、 スクリプト終了後に、そのディレクトリ変更は親プロセス(シェル)には 反映されません。 >cat /tmp/hoge.sh #! /bin/sh echo dirname=`dirname $0` cd `dirname $0` echo pwd=`pwd` >cd /home >pwd /usr/home >/tmp/hoge.sh dirname=/tmp pwd=/tmp >pwd /usr/home スクリプト内部でさらにシェルを起動すれば、 その子シェルの中では、ディレクトリ変更は有効になっていますが、 ご要望にはそわないかもしれないですね。 >cat /tmp/hoge2.sh #! /bin/sh echo dirname=`dirname $0` cd `dirname $0` csh

langria
質問者

お礼

スクリプトを連続していけば結構複雑な事ができそうですね。 参考にさせていただきます。ありがとうございました。

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

ちょっと疑問があるのですが、 > 実行した後にそのパスを利用してシェル位置まで移動したいです。 ということは、 /home/user/xxxxx/yyyyy/zzzzz/aaa.sh の中でcdでディレクトリ移動したいのでしょうか? スクリプトを実行してカレントディレクトリを移動するのは無理だと思うのですが。スクリプトの中でcdしても、スクリプトを抜けると元に戻るので。

langria
質問者

お礼

すみません。ちょっと言葉がおかしかったですね。 スクリプト内で移動をしていればよくて、親プロセスは移動しないでもよかったんです。 助言ありがとうございました。

関連するQ&A

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

    フルパス指定で実行したPHPのディレクトリを取得する事は可能でしょうか。 実行中にそのディレクトリにカレントディレクトリを移動させ、さらに処理を進めていきたいのですが、phpファイルの位置が取得できません。 /home/user/xxxxx/yyyyy/zzzzz/aaa.php ↑をどこの場所で実行しても実行中に /home/user/xxxxx/yyyyy/zzzzz/の位置を取得でき、相対パスでyyyyyにあるファイルを読み込みたいのです。 実行したファイルの位置を取得する事ってできますでしょうか。

    • ベストアンサー
    • PHP
  • 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で実行しています。 なぜカレントだと上手くいき、フルパスだと上手くいかないのでしょうか? パスが必要なコマンドも入っていないのに。。。 どなたかご教授いただけると幸いです。 宜しくお願い致します。

  • シェルスクリプトファイルから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ファイルを作っていますので、フォルダ名等のつづりミスの可能性は低いと思います。 何か設定が足りないのでしょうか? よろしくお願いいたします。

  • UNIX シェルスクリプト 文字列操作について

    あるシェルスクリプトを作成しなければいけないのですが、あまりシェルに詳しくないのでご教授いただけると助かります。 Linux上で以下のようなIDごとに定義してあるテキストファイルがあり ます。 ※2000IDほど記載してあります。 cat sample.txt --------------- ID=00001 parm=xxxxx flag=0 path=xxxxx --------------- ID=00002 parm=yyyyy flag=1 path=yyyyy --------------- ID=00003 以下略--- 上記の定義ファイルをID単位でエクセルの表に纏めたいので、以下のような横並びのCSVファイルに出力させるシェルスクリプトを作りたいのですが、どうかご教授いただけると助かります。 スクリプト実行後イメージ cat result.csv 00001,xxxxx,0,xxxxx 00002,yyyyy,1,yyyyy 00003 -----略-----

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

  • 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のファイルの場所はあってます) 不足の点などあればご指摘ください。

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

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

  • シェルの引数を、実行するパラメータに指定するには?

    シェル初心者です。 シェルの実行パラメータを、その中で実行する処理のパラメータに再び指定したいのですが可能でしょうか。 ただし、パラメータの数は可変です。 環境はSolarisです。 aaa.sh aaa bbb ccc aaa.shの中 bbbコマンド aaa bbb ccc ということを行いたいです。 パラメータ数が固定であれば問題なさそうですが 可変の場合、どのような記述をすればよいでしょうか?

  • 権限の違うシェルスクリプトの実行

    3つのシェルスクリプトがあります。 ●root権限で実行  aaa.csh ●ユーザ指定権限で実行 bbb.csh ●root権限で実行 ccc.csh この3つのシェルスクリプトはaaa.csh →bbb.csh →ccc.cshの順番でバッチ処理として cronに設定したいのですが、 権限が違うのでroot権限のcrontabとユーザ指定のcrontabに それぞれ設定しなくてはいけません。 あまりスマートではないかと思い、 何かよい方法はないかと質問させて頂きました。 3つのシェルスクリプト1つシェルスクリプトにまとめてroot権限のcrontabに設定してしまう方法とかどうでしょうか? ちなみにスクリプトの処理の内容は単純なファイルコピーなどです。 意味分かりますでしょうか? よろしくお願いします。

  • シェルスクリプト(Bash偏)の実行ファイルに関するご質問があります。

    シェルスクリプト(Bash偏)の実行ファイルに関するご質問があります。 ファイル名を変更するシェルスクリプトをbashで行おうとプログラムを作成したのですが、 実行するとbad interpreter: ディレクトリではありません とメッセージが出て終了します。記述に誤りがあるのか、実行の仕方が悪いのか分かりません。教えて下さい。 シェルの記述内容は ファイル名をtest.sh #!/bin/bash/ -f mv A.txt A.ori exit 実行方法として #>chmod x+a test.sh #>./test.sh で行いました。そうしたら、bad interpreter: ディレクトリーではありません とメッセージが出ます。 ちなみに #>. test.sh で実行するとターミナルがシェルの実行と同時に閉じてしまいますが、シェルを実行したディレクトリーを確認すると、処理が終わっておりました。