为什么我的 bash 不包含该脚本的交互式标志?

为什么我的 bash 不包含该脚本的交互式标志?

与 一起工作这个答案我已尝试使用此脚本来确定脚本是否正在运行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 是标准输入,因此通常是这样。

相关内容