给定:
tty --quiet
echo $?
0
......和。。。
tty --quiet && echo foo || echo bar
foo
为什么这是假的?
[ $(tty --quiet) ] && echo foo || echo bar
bar
也就是说,为什么命令替换的退出状态不为零?
是因为上面的命令没有标准输出吗? 还是我在空格/间距方面做错了什么?
我知道对于$(command)
,bash 通过在 subshell 环境中执行命令并将命令替换替换为命令的标准输出来执行扩展。
但是,我想做的是使用$(command)
的退出状态作为一系列复杂操作的逻辑门(替换为echo
),如下所示:
[ $(command1) ] && {
[ $(command2) ] && {
echo "Conditions 1 and 2 are true."
} || {
echo "Condition 1 is true. Condition 2 is false."
}
} || {
[ $(command3) ] && {
echo "Condition 1 is false. Condition 3 is true."
} || {
echo "Conditions 1 and 3 are false."
}
}
顺便说一句,我的 X-Y 问题涉及搞砸交互式登录 shell 的设置,我知道这样解决得更好,但现在我需要修改这个废话脚本,它经常使用tty --quiet
,皱眉。
无论如何,如果命令替换没有按照我想要的方式工作,我可以把它写成......
if [ $(command1) ] ; then
if [ $(command2) ] ; then
。等等,但这种方法似乎要优雅得多。
[ $(tty --quiet) ]
测试tty
的结果是否为空字符串。唯一涉及的退出状态是[
本身的退出状态;tty
的退出状态将被忽略。
你只是想要
if command1; then
if command2; then
echo "1 and 2 are true"
else
echo "1 is true; 2 is false"
fi
elif command3; then
echo "1 is false; 3 is true"
else
echo "1 and 3 are false"
fi
您可以使用以下命令评估返回状态:
if tty --quiet; then ...
当你执行if [ $(tty --quiet) ]
时,它等价于if [ ]
,其计算结果为假。 (手册页指出:"省略的表达式默认为 false")。 听起来您根本不想要命令替换,而只想执行命令。 换句话说,您需要:
command1 && {
command2 && {
echo "Conditions 1 and 2 are true."
} || {
echo "Condition 1 is true. Condition 2 is false."
}
} || {
command3 && {
echo "Condition 1 is false. Condition 3 is true."
} || {
echo "Conditions 1 and 3 are false."
}
}