是否可以将命令替换与退出状态一起使用,而不是标准输出?



给定:

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."
}
}

最新更新