我可以使用具有退出状态的命令替换而不是stdout吗?

时间:2018-01-04 22:05:40

标签: linux bash

假设:

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

...等。但这种方法似乎更优雅。

2 个答案:

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