首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将stderr重定向到使用/process替换创建的子subshell时出现问题

将stderr重定向到使用/process替换创建的子subshell时出现问题
EN

Stack Overflow用户
提问于 2013-05-04 05:54:12
回答 1查看 542关注 0票数 3
代码语言:javascript
复制
~ bash --version
GNU bash, version 3.2.51(1)-release (sparc-sun-solaris2.10)
Copyright (C) 2007 Free Software Foundation, Inc.

以下命令的工作方式与预期一致:

代码语言:javascript
复制
~ ls hdfhdfhdhfd 2> >(wc -l)
1

..。但这不起作用,我已经想不出原因了:

代码语言:javascript
复制
~ truss -eaf bash -c 'true' 2> >( some command to process text)

>()中的命令最终阻塞,等待输入。

如果我这样做:

代码语言:javascript
复制
~ (true; truss -eaf bash -c 'true') 2> >( some command )

..。它像预期的那样工作,尽管这不起作用:

代码语言:javascript
复制
~ (      truss -eaf bash -c 'true') 2> >( some command )
#  ^^^^^ ... note the 1st command is missing

如果我设置some command = dd bs=1,它将消耗并打印所有truss会在stderr上输出的文本,然后是块。

只有在solaris中使用truss时,我才不能在Linux中重现类似的行为。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-21 05:02:15

根据@ccarton的回复,我大致了解了正在发生的事情。举例说明:

代码语言:javascript
复制
~ truss -eaf /usr/bin/perl -e 'print "Test\n"; sleep 5' 2> >(dd bs=1 | wc -l)

在另一个终端中,我可以看到这个父/子层次:

  1. bash
    1. truss -eaf /usr/bin/perl -e printf "Test\n"; sleep 5
      1. /usr/bin/perl -e printf "Test\n"; sleep 5
      2. bash
        1. dd bs=1
          1. wc -l

truss正在等待外壳,但dd在关闭其标准输入之前不会退出...所以他们僵持不下。

代码语言:javascript
复制
~ truss -eaf -o >(some command) another command

..。使some command在当前外壳下执行,因此truss永远不是它的祖先。

我在Linux中看到了相同的层次结构,但它不会死锁。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16368118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档