当运行interactivelly或通过cron时,脚本bash无法获得$ PS1或$ – 的区别

我希望我的cron脚本在由系统用户交互式运行(例如为了debugging目的)时静静地执行(对于cron,因为我想在接收电子邮件的时候,当且仅当我得到错误)时,它们会被verbosly执行。

我已经在我的脚本中尝试了这个:

case "$-" in *i*) echo "this shell is interactive" > /tmp/log; *) echo "this shell isn't" > /tmp/log; esac 

但即使交互式运行(/ bin / bash /tmp/my_script.sh),它总是返回“这个shell不是”和

 echo $- 

在shell脚本中返回hB而不是hiB。

我也试过了

 if [ -z $PS1 ] 

认为cron没有设置$ PS1,但是从提示符echo $ PS1再次返回这个variables,并且在脚本中交互地返回任何内容:/

我想知道为什么交互式(/ bin / bash my_script.sh)这不会返回$的值 – 也不是$ PS1的值。

非常感谢您的帮助!

你可以检查stdin是否是tty 。

或者,你可以添加一个标志,告诉你的脚本安静或冗长,而不是猜测。

你可以在cron中设置一个环境variables,并检查它。

把THISISCRON = 1放在cron条目上面的一行上。

Bash脚本永远不会有交互选项。 它们无处不在。