
cron スクリプトは、システム ユーザーが対話的に実行するときには冗長に実行され (デバッグ目的など)、それ以外のときには静かに実行されるようにしたい (cron の場合、エラーが発生した場合にのみ電子メールを受信したいため)。
私はスクリプトでこれを試しました:
case "$-" in
*i*) echo "this shell is interactive" > /tmp/log;
*) echo "this shell isn't" > /tmp/log;
esac
しかし、対話的に実行した場合でも(/bin/bash /tmp/my_script.sh)、常に「このシェルはそうではありません」と返され、
echo $-
シェル スクリプトでは、hiB ではなく hB が返されます。
私も試してみました
if [ -z $PS1 ]
cron には $PS1 が設定されていないと考えていましたが、プロンプトから echo $PS1 を実行するとこの変数が返され、スクリプト内で対話的に実行すると何も返されません :/
対話的に (/bin/bash my_script.sh)、$- の i 値も $PS1 の値も返されない理由を知りたいです。
ご協力いただき誠にありがとうございます!
答え1
あなたは出来るstdin が tty であるかどうかを確認する。
あるいは、スクリプトにフラグを追加して、推測させるのではなく、静かにするか詳細にするかを指示することもできます。
答え2
cron で環境変数を設定し、それを確認することもできます。
cron エントリの上に、THISISCRON=1 を単独の行に記述します。
答え3
Bash スクリプトでは対話型オプションがオンになることはありません。どこでも非対話型です。