为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

请问这是什么原因?

正在回答

2 回答

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

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

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

mkdir ss | cd /root/ss

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

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

0 回复 有任何疑惑可以回复我~
#1

Atlas_Wu 提问者

非常感谢!
2017-05-10 回复 有任何疑惑可以回复我~

第一点,$?中存放的是前一条命令的退出码,一般情况下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之前终止,有可能更新了$?的值。这个是我的推测,

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信