dポイントプレゼントキャンペーン実施中!

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

A 回答 (5件)

シェル系のスクリプトは外部コマンドをいろいろ呼び出すため、マニュアルには記載がない事は多いかもしれません。



bashでも同じですが、"dirname $0"コマンドでスクリプトまでのディレクトリ名が取り出せます。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございました。

cronで起動させようとしているのですが、dirname $0だと相対パスしか得られない気がするのですが、勘違いしているでしょうか?

例えば同じスクリプトを再利用するとして、
/aaa/bbb/app1/ccc/script.sh
/aaa/bbb/app2/ccc/script.sh
このようにスクリプトの存在するディレクトリ名を認識して処理を変える場合に、dirname $0でやってみたのですが、相対パスしか取れないようでした。

お礼日時:2009/03/25 14:55

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2009/03/26 13:26

なんとなく負けた気がするけど、



cd `dirname $0`
script_dir=$PWD

で取得できそうです。

スクリプト内でのcdは呼び出し元には影響しないので問題ないかと。
もし元のdirに戻るのであれば、pushd/popdするなり、
cdする前に$PWDを保存しておくなり、cd -するなりで対応できそうです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/03/26 13:25

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から実行させて確かめてみてはどうでしょうか。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/03/26 13:24

ちなみに bash までいくと


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

早速のご回答ありがとうございました。

$0にフルパスで入っていないようなのですが、$PWDのような形式で取得することはできないでしょうか?

お礼日時:2009/03/25 14:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!