- ベストアンサー
cshのファイル位置
cronからcshスクリプトを呼び出して処理をさせようとしていますが、汎用的にしたい(別のディレクトリでも再利用したい)ため、スクリプトの存在するディレクトリを取得したいと思いました。マニュアルを見ても無いようなので質問します。phpでいうdirname(__FILE__)のような、スクリプト位置を返すシェル変数または手段は無いでしょうか?bash等でも構いません。よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
シェル系のスクリプトは外部コマンドをいろいろ呼び出すため、マニュアルには記載がない事は多いかもしれません。 bashでも同じですが、"dirname $0"コマンドでスクリプトまでのディレクトリ名が取り出せます。
その他の回答 (4)
- Tacosan
- ベストアンサー率23% (3656/15482)
$PWD からの相対パスでいいなら $PWD/$0 で「絶対パスっぽい」ものが得られるので, そこから努力する?
お礼
ありがとうございました。dirname $0で目的を達しました。
- P-mann
- ベストアンサー率62% (56/89)
なんとなく負けた気がするけど、 cd `dirname $0` script_dir=$PWD で取得できそうです。 スクリプト内でのcdは呼び出し元には影響しないので問題ないかと。 もし元のdirに戻るのであれば、pushd/popdするなり、 cdする前に$PWDを保存しておくなり、cd -するなりで対応できそうです。
お礼
ありがとうございました。コマンドラインで$0が絶対パスで出なかったのでそういうものと勘違いしていました。cronからは$0でファイル名が絶対パスで正しく取得でき、dirname $0でディレクトリを取得できました。
- ABE Yasuhiro(@yadiary)
- ベストアンサー率66% (18/27)
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から実行させて確かめてみてはどうでしょうか。
お礼
cronで試さないで返事を書き申し訳ありませんでした。おっしゃるとおり、cronから呼び出したところ$0は絶対パスで得られ、dirnameでディレクトリ名が取得できました。ありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
ちなみに bash までいくと ${0%/*}/. により, ($0 にフルパスで入っていれば) 他のコマンドを起動することなく当該スクリプトのあるディレクトリが得られます. 蛇足だけど, スクリプトを書くなら csh はやめた方がいいかも....
お礼
早速のご回答ありがとうございました。 $0にフルパスで入っていないようなのですが、$PWDのような形式で取得することはできないでしょうか?
お礼
早速のご回答ありがとうございました。 cronで起動させようとしているのですが、dirname $0だと相対パスしか得られない気がするのですが、勘違いしているでしょうか? 例えば同じスクリプトを再利用するとして、 /aaa/bbb/app1/ccc/script.sh /aaa/bbb/app2/ccc/script.sh このようにスクリプトの存在するディレクトリ名を認識して処理を変える場合に、dirname $0でやってみたのですが、相対パスしか取れないようでした。