• ベストアンサー

cshのファイル位置

cronからcshスクリプトを呼び出して処理をさせようとしていますが、汎用的にしたい(別のディレクトリでも再利用したい)ため、スクリプトの存在するディレクトリを取得したいと思いました。マニュアルを見ても無いようなので質問します。phpでいうdirname(__FILE__)のような、スクリプト位置を返すシェル変数または手段は無いでしょうか?bash等でも構いません。よろしくお願いします。

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

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

シェル系のスクリプトは外部コマンドをいろいろ呼び出すため、マニュアルには記載がない事は多いかもしれません。 bashでも同じですが、"dirname $0"コマンドでスクリプトまでのディレクトリ名が取り出せます。

mocapapa89
質問者

お礼

早速のご回答ありがとうございました。 cronで起動させようとしているのですが、dirname $0だと相対パスしか得られない気がするのですが、勘違いしているでしょうか? 例えば同じスクリプトを再利用するとして、 /aaa/bbb/app1/ccc/script.sh /aaa/bbb/app2/ccc/script.sh このようにスクリプトの存在するディレクトリ名を認識して処理を変える場合に、dirname $0でやってみたのですが、相対パスしか取れないようでした。

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

$PWD からの相対パスでいいなら $PWD/$0 で「絶対パスっぽい」ものが得られるので, そこから努力する?

mocapapa89
質問者

お礼

ありがとうございました。dirname $0で目的を達しました。

  • P-mann
  • ベストアンサー率62% (56/89)
回答No.4

なんとなく負けた気がするけど、 cd `dirname $0` script_dir=$PWD で取得できそうです。 スクリプト内でのcdは呼び出し元には影響しないので問題ないかと。 もし元のdirに戻るのであれば、pushd/popdするなり、 cdする前に$PWDを保存しておくなり、cd -するなりで対応できそうです。

mocapapa89
質問者

お礼

ありがとうございました。コマンドラインで$0が絶対パスで出なかったのでそういうものと勘違いしていました。cronからは$0でファイル名が絶対パスで正しく取得でき、dirname $0でディレクトリを取得できました。

回答No.3

dirnameは引数を文字列に取って、最後のファイル or ディレクトリを取り去ってくれるコマンドです。 そのため$0の中身が"/aaa/bbb/app1/ccc/script.sh"であれば、"/aaa/bbb/app1/ccc"が実行結果になります。 $0の中身はどのようにスクリプトを指定したかに依りますので、crontabファイルに"0 * * * * /aaa/bbb/app1/ccc/script.sh"などと書いて実行させれば"dirname $0"の実行結果は"/aaa/bbb/app1/ccc"になります。 テストで"./script.sh"などと実行すれば、"."から始まる相対パスになりますが、cronから実行させて確かめてみてはどうでしょうか。

mocapapa89
質問者

お礼

cronで試さないで返事を書き申し訳ありませんでした。おっしゃるとおり、cronから呼び出したところ$0は絶対パスで得られ、dirnameでディレクトリ名が取得できました。ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

ちなみに bash までいくと ${0%/*}/. により, ($0 にフルパスで入っていれば) 他のコマンドを起動することなく当該スクリプトのあるディレクトリが得られます. 蛇足だけど, スクリプトを書くなら csh はやめた方がいいかも....

mocapapa89
質問者

お礼

早速のご回答ありがとうございました。 $0にフルパスで入っていないようなのですが、$PWDのような形式で取得することはできないでしょうか?

関連するQ&A