• ベストアンサー

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

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

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答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% (4900/10358)
回答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