スクリプト bash は、対話形式または cron 経由で実行しているときに $PS1 または $- の違いを取得できません。

スクリプト bash は、対話形式または cron 経由で実行しているときに $PS1 または $- の違いを取得できません。

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 スクリプトでは対話型オプションがオンになることはありません。どこでも非対話型です。

関連情報