![スクリプト bash は、対話形式または cron 経由で実行しているときに $PS1 または $- の違いを取得できません。](https://rvso.com/image/617241/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%20bash%20%E3%81%AF%E3%80%81%E5%AF%BE%E8%A9%B1%E5%BD%A2%E5%BC%8F%E3%81%BE%E3%81%9F%E3%81%AF%20cron%20%E7%B5%8C%E7%94%B1%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AB%20%24PS1%20%E3%81%BE%E3%81%9F%E3%81%AF%20%24-%20%E3%81%AE%E9%81%95%E3%81%84%E3%82%92%E5%8F%96%E5%BE%97%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82.png)
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 スクリプトでは対話型オプションがオンになることはありません。どこでも非対話型です。