问答详情
源自:1-2 shell条件判断式语句之按文件类型判断

[ -e /root/install(是一个不存在的文件) ] | echo $? 为什么输出0

单独执行[ -e /root/install(不存在) ] ,然后再执行 echo $? ,输出是1

可是执行命令 [ -e /root/install ] | echo $? ,输出却是0

请问这是什么原因?

提问者:Atlas_Wu 2017-05-09 21:14

个回答

  • 慕哥4231644
    2017-05-09 23:51:55
    已采纳

    管道符的前者必须能产生标准的输出,就是你能看到的摆在眼前的结果

    没有标准输出就没有输入就是错的就是0了

    比如我新建一个目录再用管道打开理论是可以的

    mkdir ss | cd /root/ss

    结果就不对了。因为mkdir没有一个标准的输出

    自己想的不知道对不对,小白一枚

  • 慕粉1720382552
    2017-07-11 14:15:06

    第一点,$?中存放的是前一条命令的退出码,一般情况下0代表正确执行退出,而不是代表错误。

    第二点,单独执行test -e /root/install,对于这条命令,返回值0代表文件存在,1代表不存在,由于文件不存在,返回1给$?,接着执行echo $?,则打印1;echo命令执行完成后,由于是正确执行,返回0给$?,此时再执行一次echo $?,则会输出0。注意,echo $?执行完成后才会去更新$?的值。

    第三点,这个问题出现的很奇葩,我感觉没啥实际意义。对于管道符连接的多条命令,我查了资料,每条命令的退出码存放在数组变量PIPESTATUS中,你可以用echo ${PIPESTATUS[@}查看。至于这里为什么会出现echo $?一个为1,一个为0的情况,我推测是因为管道符的执行方式的原因。如果你的命令写成[ -e /root/install ] ; echo $?,那么会显示为1,这里分号;就是指顺序单个执行。[ -e /root/install ] | echo $?会显示$?为0,可能是因为管道程序改变了$?的值。你要知道,管道符是把前一条命令的标准输出传递给后一条命令,你的这条命令里,前一条命令没有标准输出,后一条命令不接受标准输出,所以管道程序在执行echo之前终止,有可能更新了$?的值。这个是我的推测,