3
~ bash --version
GNU bash, version 3.2.51(1)-release (sparc-sun-solaris2.10)
Copyright (C) 2007 Free Software Foundation, Inc.

以下命令按预期工作:

~ ls hdfhdfhdhfd 2> >(wc -l)
1

......但这不起作用,我已经没有想法找出原因:

~ truss -eaf bash -c 'true' 2> >( some command to process text)

内部的命令>()最终阻塞等待输入。

如果我这样做:

~ (true; truss -eaf bash -c 'true') 2> >( some command )

...它按预期工作,尽管这不起作用:

~ (      truss -eaf bash -c 'true') 2> >( some command )
#  ^^^^^ ... note the 1st command is missing

如果我制作some command= dd bs=1,它会消耗并打印所有文本桁架会吐出的stderr,然后阻塞。

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

4

1 回答 1

1

根据@ccarton 的回复,我对正在发生的事情有了一个粗略的了解。为了显示:

~ 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在其标准输入关闭之前不会退出......所以他们死锁了。

~ truss -eaf -o >(some command) another command

... 导致some command在当前 shell 下执行,所以truss永远不是它的祖先。

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

于 2013-06-20T21:02:15.053 回答