假设:
tty --quiet
echo $?
0
...和...
tty --quiet && echo foo || echo bar
foo
为什么这是假的?
[ $(tty --quiet) ] && echo foo || echo bar
bar
也就是说,为什么命令替换的退出状态不为零?
是否因为上面的命令没有stdout输出?或者我在空格/间距方面做错了什么?
I understand对于$(command)
,bash通过在子shell环境中执行命令并使用命令的标准输出替换命令替换来执行扩展。
但是,我想要做的是使用 $(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 Problem涉及到交互式登录shell的设置,我知道这个问题比THIS更好解决但是现在我需要修改这个垃圾脚本并使用{{1}很多,皱眉。
无论如何,如果命令替换不能按照我想要的方式工作,我可以把它写成......
tty --quiet
...等。但这种方法似乎更优雅。
答案 0 :(得分:2)
[ $(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
答案 1 :(得分:0)
您可以使用以下方式评估返回状态:
if tty --quiet; then ...
执行if [ $(tty --quiet) ]
时,它等同于if [ ]
,其评估为false。 (手册页指出:'省略的EXPRESSION默认为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."
}
}