[ -e /root/install(是一个不存在的文件) ] | echo $? 为什么输出0
单独执行[ -e /root/install(不存在) ] ,然后再执行 echo $? ,输出是1
可是执行命令 [ -e /root/install ] | echo $? ,输出却是0
请问这是什么原因?
单独执行[ -e /root/install(不存在) ] ,然后再执行 echo $? ,输出是1
可是执行命令 [ -e /root/install ] | echo $? ,输出却是0
请问这是什么原因?
2017-05-09
第一点,$?中存放的是前一条命令的退出码,一般情况下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之前终止,有可能更新了$?的值。这个是我的推测,
举报