我希望我的 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),它也总是返回“此 shell 不是”并且
echo $-
在 shell 脚本中返回 hB 而不是 hiB。
我也尝试过
if [ -z $PS1 ]
认为 cron 没有设置 $PS1,但是再次,从提示符中,echo $PS1 返回此变量,并且在脚本中交互地,它不返回任何内容 :/
我想知道为什么交互方式(/bin/bash my_script.sh)这不返回 $- 的 i 值也不返回 $PS1 的值。
非常感谢您的帮助!
答案1
你可以检查 stdin 是否是 tty。
或者,您可以向脚本添加一个标志,告诉它保持安静或详细,而不是让它猜测。
答案2
您可以在 cron 中设置环境变量,并检查它。
将 THISISCRON=1 放在 cron 条目上方的一行上。
答案3
Bash 脚本从不启用交互选项。它们在任何地方都是非交互式的。