ソースはcwdを認識しませんか?

ソースはcwdを認識しませんか?

別のファイルをインポートするファイルをインポートする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

発生する可能性のある問題:

  1. いいえシェルボーンscript.sh。 cronに実行を指示すると、script.sh次のように実行されます/bin/sh -c script.shSHELLcrontabが内部的にthat以外の他の項目を指さない限り/bin/sh)。 shebangがないので、以下が適用されます。Shebangなしでスクリプトを実行するシェルインタプリタとは何ですか?答えは、クローンが使用するシェルによって異なり、これについてはわかりません。shスクリプトのインタプリタとして別のものを選択することもできます。選択してもsh他のものから提供できます。 (Ubuntuではデフォルトに設定されていますが、実際にはそうではありません。)dashbashdashあなたの場合)。

    要点は、script.shスクリプトがcronで実行されているときにインタプリタが何であるかを実際には知らないことです。場合によっては、スクリプトがcronでまったく起動しないことがあります。

    OTOHインタラクティブシェルでスクリプトを実行するときに別のインタプリタを選択すると機能します。

  2. cd /script/dir何らかの理由で失敗する可能性があります(はい)。

  3. sourceはい alias.ですが、すべてのシェルにあるわけではありません。私たちは通訳を知らないので、それが理解しているかどうかはわかりませんsource

  4. sourceインタプリタがこれをasと理解しても、.引数はまだfuncs.sh含まれていません/。この場合、POSIXの動作は次のよう.になります。funcs.sh$PATH

    • $PATH含まれていても.(つまり、現在の作業ディレクトリ)、cronの同じ変数には含まれない可能性があります。

    • 検索に$PATH失敗した場合のみ一部シェルは現在の作業ディレクトリを試みます。

問題を解決するには:

  1. 実行中に解釈に使用されるシェルをscript.sh制御できるように、内部にshebangを使用してください。script.sh

    (選択したシェルによっては、修正(3)と(4)が必要になる場合もあれば不要な場合もあります。何の害もありません。

  2. 失敗した場合は中止しますcd。失敗後もスクリプトがcd続く場合は、スクリプトがfuncs.sh無効なディレクトリからソースを取得しようとする可能性があります。

  3. .代わりに使用してくださいsource。前者は移植可能ですが、後者はそうではありません。

  4. /(この場合の代わりに)を含む./funcs.sh明示的なパスを使用すると、funcs.sh検索する必要がなく、$PATH意味するファイルが何であるかがわかります。

修正内容はscript.sh次のとおりです。

#!/bin/sh
cd /script/dir || exit 1
. ./funcs.sh

funcs.shファイルはシェル解釈として検索されるため、shebang内にある必要はありませんが、script.sh修正(3)と(4)がまだ必要になる場合があります(選択したシェルに応じて)。

おすすめ記事