注意,我正在ksh
CentOS 中使用和运行。
我有一个 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
分支(如果有)。