Atlas_Wu
2017-05-09 21:14
单独执行[ -e /root/install(不存在) ] ,然后再执行 echo $? ,输出是1
可是执行命令 [ -e /root/install ] | echo $? ,输出却是0
请问这是什么原因?
管道符的前者必须能产生标准的输出,就是你能看到的摆在眼前的结果
没有标准输出就没有输入就是错的就是0了
比如我新建一个目录再用管道打开理论是可以的
mkdir ss | cd /root/ss
结果就不对了。因为mkdir没有一个标准的输出
自己想的不知道对不对,小白一枚
第一点,$?中存放的是前一条命令的退出码,一般情况下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之前终止,有可能更新了$?的值。这个是我的推测,
shell编程之条件判断与流程控制
35507 学习 · 139 问题
相似问题