为什么“if tty -s”有效但“if [ tty -s ]”无效?

为什么“if tty -s”有效但“if [ tty -s ]”无效?

注意,我正在kshCentOS 中使用和运行。

我有一个 shell 脚本,其中记录器函数设置如下:

if tty -s
then
  echo "${FOO}" | tee -a ${BAR_LOG_FILE}
else
  echo "${FOO}" >> ${BAR_LOG_FILE} 
fi

我的问题是,当我将其重构为看起来像代码中的if所有其他测试时,它停止运行。if

为什么?

我的重构如下:

if [ tty -s ];
then
  echo "${FOO}" | tee -a ${BAR_LOG_FILE}
else
  echo "${FOO}" >> ${BAR_LOG_FILE} 
fi

我唯一的改变是在 周围加上括号if并添加;,就像我的其余if测试一样,它们都按预期工作。

我的重构导致了一个错误,看起来无法BAR_LOG_FILE找到。

这里发生了什么?

答案1

后面的方括号if不是 shell 语法,可以根据风格偏好省略或不省略,它们是一个单独的命令,test。 (链接的联机帮助页描述了外部test/[命令,但许多 shell 提供了自己的实现。)

写作

if [ tty -s ];

相当于写作

if test tty -s;

由于test/[没有tty运算符,因此失败。

if后面跟着一个命令,它运行该命令,该命令的退出代码确定在 后采用哪个分支if:如果为 0,则then采用该分支,否则采用该else分支(如果有)。

相关内容