2013-01-16 26 views
0

以下代码:运行时bash,发球在命名管道?

#!/bin/bash -x 
mkfifo pipe 2>/dev/null 
tee pipe >/dev/null & 
cat pipe 

不产生输出如下:

$ echo "hi" | ./test.sh 
+ mkfifo pipe 
+ cat pipe 
+ tee pipe 
$ 

为什么?我期望tee将stdin复制到命名管道(和/dev/null),然后cat将命名管道的内容复制到stdout。为什么它不起作用?

我想写一个更大的bash脚本,我真的需要tee在那里,其他的东西在/dev/null的地方。我缩小了上述例子的意外行为。

+0

尝试之间的管道改为'非缓冲猫管道'。您可能必须搜索未缓存的计算机,并使用完整路径进行调用,或将路径添加到PATH变量。或者,而不是回声“嗨”,将一个非常大的文件放到你的./test.sh文件中。祝你好运。 – shellter

+0

我试过'./test.sh <〜/ .xsession-errors',大概1Mb,但还是什么都没有。 –

+0

奇怪的是,'猫| tee pipe>/dev/null'按预期工作。但为什么?! –

回答

1

当后台进程的标准输入将被设置为/dev/null

#!/bin/bash -x 
mkfifo pipe 2>/dev/null 
cat - | tee pipe >/dev/null & 
cat pipe 

所以,你需要指定要母的stdin,你的情况echo./test.sh