• ベストアンサー

シェルススクリプト内のパス指定について

プログラムを実行するシェルスクリプト内に以下のように絶対パスで環境変数の設定用のシェルスクリプトが絶対パスで書かれているのですが、この場合だと環境が変わるたびにシェルスクリプト内のパスを書き換えなければなりません。 /dir1/dir2/dir3/setenv.sh 相対パスにすれば書き換える必要はなくなるのですが、お作法上は相対パスで書くことは問題ない(良いと)されているのでしょうか? ../../dir/setenv.sh

  • totmon
  • お礼率66% (213/319)

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.3

作法という範囲では気にする必要はありません。正しく動くなら相対バスでいいです。 ただし、カレントディレクトリが特定の階層で無いと正しく動かないスクリプトになってしまいますが、それでいいのでしょうか? 状況が書かれていないので、該当しないかもしれませんが、通常は、親スクリプトのディレクトリからの相対で指定するのがよいでしょう。親スクリプトと同じディレクトリにあるsetenv.shを起動するなら、 SCRIPT_DIR=${0%/*} $SCRIPT_DIR/setenv.sh です。( ${0%/*} で親スクリプトファイル名を削除してディレクトリ名を求めます)

totmon
質問者

お礼

ありがとうございました。

totmon
質問者

補足

すみません。以下を実行してみたのですが、「文法があいまいです」というエラーがでてしまいました。 SCRIPT_DIR=${0%/*} $SCRIPT_DIR/setenv.sh ${0%/*}これは正規表現か何かでしょうか? OSはSunOS 5.9です。

その他の回答 (3)

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.4

>${0%/*}これは正規表現か何かでしょうか? >OSはSunOS 5.9です。 Linuxのカテゴリでの質問だったので、bash前提で回答しました。 SunOSならSolarisカテゴリが適当です。 bashが使えないとすると、 SCRIPT_DIR=`expr "$0" : '\(.*\)/'` でディレクトリが取り出せます。「最後に出てくる / の手前まで」を取り出すという意味です。

totmon
質問者

お礼

ありがとうございました。

回答No.2

そのスクリプトを起動するときに、いつもその相対ディレクトリが有効なディレクトリで起動するなら構わないです。 例えばそのスクリプトが環境変数に入っているとしたら、スクリプト名さえ打てばどのディレクトリからでも起動できてしまいますが、相対パスで指定した先に使用するファイルがなければエラーになります。 またcronで動かす際にも問題が起きるかもしれません。 そのような理由で、普通はフルパス(絶対パス)で記述するのが安全とされています。 要は動きさえすれば、あとはあなたのお好みでどうぞ、ということです。

totmon
質問者

お礼

ありがとうございました。

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

 お作法かどうかは知らないが、よく使われているのは環境変数を使う方法やね。  たとえばApache Tomcatの$CATALINA_HOME、Oracle Databaseの$ORACLE_BASEと$ORACLE_HOME。  相対パスもよく使われていると思いますわよ。たとえば、hogehoge.shとhogehoge_env.shなどがある場合、hogehoge.shの中で「. ./hogehoge.env.sh」などと書かれてある事も多いんじゃないかな。これはれっきとした相対パスだよね。  個人的には、配布物そのものの形できちんと実行できるのであれば、相対パスにしてもそんな問題は無いと思う。

totmon
質問者

お礼

ありがとうございました。

関連するQ&A

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

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

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

  • 『存在するかどうか分からない』環境変数にcshで新しいパスを設定したい

    Linuxを利用しており、「『存在するかどうか分からない』環境変数に新しいパスを設定したい」のですが、うまくいきません。 言い方を変えると、対象の環境変数が存在しようが存在しまいが、うまくいくようにしたいのです。 具体的には、ログインシェルに tcsh を使用しているため、hogehoge.cshを作成し、/etc/csh/login.d/に入れました。hogehoge.cshの内容は以下のようになります。 #!/bin/csh setenv HOGEHOGEPATH /usr/lib/hogehoge:${HOGEHOGEPATH} ログインしてみると HOGEHOGEPATH: Undefined variable. といった内容のエラーが表示され、環境変数も設定されません。 shで設定する方法もありますがcshで良い書き方はないでしょうか。ご教示お願いいたします。

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

  • WindowsのPATHの設定と有効性について

    Windows10での環境変数のパス指定はコンパネ→システム→システムの詳細設定→環境変数と進んで環境変数PATHを編集して指定することができます。確認したのですが、確かにそうなっています。スペルミスも発見できません(昔と違って表のようになってます)。それを指定した後、パワーシェルでその新規に指定したパスでの実行ファイルを入力しても実行しません。実行ファイルが見つからないというメッセージです。 環境変数PATHがどうなっているか調べるためにコマンドプロンプト(パワーシェルじゃないもの)でPATHコマンドを入力してみると確かに指定されていません。指定したフォルダが入っていないのです。 設定しているのに、設定されていないようになっている理由が不明です。なせ有効にならないのだろうと思うのですが。例えばフォルダ名が.abcのように隠しファイルのようなドットが先頭に入っているとダメなのでしょうか。確かに設定されているのに、何かの理由で有効になっていない理由が知りたいのですが。そして有効化したいのです。よろしくお願いします。

  • solarisのsetenvが無効

    shell 記述したsetenvが無効になります。 プロンプトから打ち込むとOKなのですが、 test.sh shellに ---------------------------------------------- #!/bin/csh setenv 環境変数 環境変数パス ---------------------------------------------- などと記述し、sh test.sh でプロンプトから 実行したときのsetenvでは無効になります。 root ではなく、通常ユーザなので、管理者が 制限をしているのかもしれませんが、 ログイン時の.cshrc に記述されたsetenvは有効になって いる様子で、パスが通らないと動かないDB用のコマンドが ちゃんと起動します。 どなたか、ご存知の方がいらっしゃいましたら 教えてください。宜しくお願い致します。

  • bashでの変数の引渡し方法

    bashを使用するのが初めてなので教えてください。 shellscriptの中で変数を設定するのに共通変数設定用の子Shellを実行して変数を設定したいと思っていますが、うまく動きません。どのように設定したらいいのでしょうか。cshのときはsetenvでよかったのですが。。 親shell(hoge.sh) -------------- #!/bin/sh ./setenv.sh #変数設定用子Shell echo $USER exit 0 -------------- 子Shell(setenv.sh) -------------- #!/bin/sh USER="hoge" exit 0 -------------- 実行すると以下のようになります。 $./hoge.sh USER: not found

  • シェルからJavaを起動したい

    シェルからJavaを起動したい 上記ですけど、Linuxで毎回「java パッケージ名.クラス名」を打つのは面倒なので、 シェルスクリプトのファイルを作って、それを実行するだけで起動できるようにしようと思っています。 が、クラスが見つからないってエラーが出て実行できませんでした。 (「java パッケージ名.クラス名」を実行しているディレクトリにシェルを作ってます) 恐らく環境変数などの設定がシェルの中にいるのではないかと思いますが、 シェルスクリプトとかLinuxの環境には疎い為、どういった記述が必要なのか解りません。 どなたか例を提示して頂けないでしょうか? ちなみに、一般的なJavaの環境変数や、 プロジェクト特有・jarファイル等の環境変数は設定済みです。 それから、シェルは以下のように記述してます。 #!/bin/sh java パッケージ名.クラス名 よろしくお願いします。

  • Linux ファイル 絶対パス、相対パス

    Linux CentOSの /mnt/loca/bin の配下にrootで test.sh common.sh data.txtを作成 chmod 755 chown root:rootでファイルもフォルダも設定。 別のユーザ testUserでログインし、 sh test.shを実行すると、sh内で記載されている . ./common.shのインクルードに失敗 data.txtの参照 cat data.txt に失敗してしまいます。 絶対パスに変更し、 . /mnt/local/bin/common.sh cat /mnt/local/bin/common.sh にすると問題なく動作します。 また、rootユーザでログインすると相対パスでも問題なく動作します。 rootユーザでないユーザでは絶対パスにする必要があるのでしょうか? 環境変数PATH に /mnt/local/binはとおっています。 ご教授よろしくお願い致します。

  • ". ./"はどういう意味ですか?

    SolarisやLinuxで、 環境変数を設定するのにシェルを作っておいて、 それを実行するようにしています。 たとえば”setenv”だとします。 今まで何気なく、". ./setenv"の用にしていたのですが(こうすれば権限が無くても実行できるので) ふと、”./setenv”の用にしてみると、 有効にならないことがわかりました。 試しにグーグルで". ./"と検索してみたのですが、なにもでませんでした。 ". ./"とはどういう意味なのでしょうか? 今更身の回りの人に聞けません(恥 すみませんが、教えていただけると助かります。