与 一起工作这个答案我已尝试使用此脚本来确定脚本是否正在运行cron
或以交互方式运行:
#!/bin/bash
# "reliable" interactive check
case "$-" in
*i*)
interactive=1
;;
*)
interactive=0
;;
esac
echo \$-=$- interactive=$interactive
# "maybe" interactive check
if [[ -t 0 ]]; then
interactive=1
else
interactive=0
fi
echo interactive=$interactive
令人震惊的是,对于它是否是交互式的,我得到了相互矛盾的答案。这是我从 bash 提示符运行它时的输出:
$-=hB interactive=0
interactive=1
仅供参考,我在 Mint 18 上有:
$ bash --version
GNU bash, version 4.3.42(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redist
所以我的核心问题是为什么“可靠”的方法会产生错误的答案?为什么 bash 没有在选项中包含预期的标志? 文档似乎表明应该这样做。 “也许”的版本实际上更可靠吗?
答案1
“可靠”方法会失败,因为“此 shell”是运行脚本的 shell,它不是交互式的,而不是启动脚本的 shell。
检查标准输入是否是终端 ( [[ -t 0 ]]
) 稍微更可靠,但它仍然无法确定脚本是否从 运行cron
:有一些方法可以[[ -t 0 ]]
成功运行脚本,即使它不是从终端运行。
接受的答案检查脚本是否由 cron 启动,而不是手动调用对我来说似乎更可靠。
答案2
[[ -t 0 ]]
只是确定 fd0 是否在(伪)终端上打开。由于 fd0 是标准输入,因此通常是这样。