別のファイルをインポートするファイルをインポートするbashスクリプトがあります。
script.sh:
cd /script/dir
source funcs.sh
funcs.sh:
...
source mode.sh
/script/dirのコマンドラインからスクリプトを実行すると、スクリプトが正しく実行されます。しかし、crontabで実行すると、funcs.shファイルはmode.shを見つけることができません。cd /script/dir
何らかの理由で渡されない可能性がありますか?スクリプトで何でもできますか?それとも、cronや同様のものでCDを書く必要がありますか?
ベストアンサー1
発生する可能性のある問題:
いいえシェルボーン中
script.sh
。 cronに実行を指示すると、script.sh
次のように実行されます/bin/sh -c script.sh
(SHELL
crontabが内部的にthat以外の他の項目を指さない限り/bin/sh
)。 shebangがないので、以下が適用されます。Shebangなしでスクリプトを実行するシェルインタプリタとは何ですか?答えは、クローンが使用するシェルによって異なり、これについてはわかりません。sh
スクリプトのインタプリタとして別のものを選択することもできます。選択してもsh
他のものから提供できます。 (Ubuntuではデフォルトに設定されていますが、実際にはそうではありません。)dash
bash
dash
あなたの場合)。要点は、
script.sh
スクリプトがcronで実行されているときにインタプリタが何であるかを実際には知らないことです。場合によっては、スクリプトがcronでまったく起動しないことがあります。OTOHインタラクティブシェルでスクリプトを実行するときに別のインタプリタを選択すると機能します。
cd /script/dir
何らかの理由で失敗する可能性があります(はい)。source
はい alias.
ですが、すべてのシェルにあるわけではありません。私たちは通訳を知らないので、それが理解しているかどうかはわかりませんsource
。source
インタプリタがこれをasと理解しても、.
引数はまだfuncs.sh
含まれていません/
。この場合、POSIXの動作は次のよう.
になります。funcs.sh
$PATH
$PATH
含まれていても.
(つまり、現在の作業ディレクトリ)、cronの同じ変数には含まれない可能性があります。検索に
$PATH
失敗した場合のみ一部シェルは現在の作業ディレクトリを試みます。
問題を解決するには:
実行中に解釈に使用されるシェルを
script.sh
制御できるように、内部にshebangを使用してください。script.sh
(選択したシェルによっては、修正(3)と(4)が必要になる場合もあれば不要な場合もあります。何の害もありません。
失敗した場合は中止します
cd
。失敗後もスクリプトがcd
続く場合は、スクリプトがfuncs.sh
無効なディレクトリからソースを取得しようとする可能性があります。.
代わりに使用してくださいsource
。前者は移植可能ですが、後者はそうではありません。/
(この場合の代わりに)を含む./funcs.sh
明示的なパスを使用すると、funcs.sh
検索する必要がなく、$PATH
意味するファイルが何であるかがわかります。
修正内容はscript.sh
次のとおりです。
#!/bin/sh
cd /script/dir || exit 1
. ./funcs.sh
funcs.sh
ファイルはシェル解釈として検索されるため、shebang内にある必要はありませんが、script.sh
修正(3)と(4)がまだ必要になる場合があります(選択したシェルに応じて)。