加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

shell – 为什么管道总是返回“0”后回显返回值($?)

发布时间:2020-12-15 22:50:53 所属栏目:安全 来源:网络整理
导读:我意识到这个事实,但我不知道为什么: cat abc | echo $? 如果abc不存在,但上面的命令仍然返回0.任何人都知道为什么理论? 解决方法 它必须是这种方式的原因是管道由同时运行的进程组成. cat的退出代码不能作为参数传递给echo,因为在命令开始运行时设置了参
我意识到这个事实,但我不知道为什么:

cat abc | echo $?

如果abc不存在,但上面的命令仍然返回0.任何人都知道为什么理论?

解决方法

它必须是这种方式的原因是管道由同时运行的进程组成. cat的退出代码不能作为参数传递给echo,因为在命令开始运行时设置了参数,并且在cat完成之前echo开始运行.

echo不接受来自stdin的输入,因此管道字符右侧的echo总是错误的.

更新:

既然现在很清楚你是在问一个真正的问题,而不仅仅是误解了你看到的东西,我自己也试过了.我从我尝试过的大多数shell(dash,zsh,pdksh,posh和bash 4.2.37)中得到了我认为正确的结果(1),但是从bash 4.1.10和ksh(版本JM 93u 2012-02)得到0 -29).

我假设版本之间bash行为的变化是故意的,4.1.x行为被认为是一个bug.如果你看起来足够努力,你可能会在更新日志中找到它.关于ksh不知道.

csh和tcsh(用$status代替$?)也说0,但我打赌没有人关心这个.

邀请具有较大shell集合的人进行测试:

for sh in /bin/sh /bin/ksh /bin/bash /bin/zsh ...insert more shells here...; do
  echo -n "$sh "
  $sh -c 'false;true|echo $?'
done

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读