Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在bash脚本中分叉/管道stdin?_Bash_Pipe_Stdin - Fatal编程技术网

如何在bash脚本中分叉/管道stdin?

如何在bash脚本中分叉/管道stdin?,bash,pipe,stdin,Bash,Pipe,Stdin,我有一个脚本,我想运行 $ myscript < mydata.dat 每个人都需要一份STDIN。可能吗 差不多 # obviously this is broken ... STDIN | php script1.php > out1 STDIN | php script2.php > out2 STDIN | php script3.php > out3 要将stdin复制到多个进程,请使用tee和进程替换: 构造>(…)称为进程替换。它创建了一个类似文件的对象

我有一个脚本,我想运行

$ myscript < mydata.dat
每个人都需要一份STDIN。可能吗

差不多

# obviously this is broken ...
STDIN | php script1.php > out1
STDIN | php script2.php > out2
STDIN | php script3.php > out3

要将stdin复制到多个进程,请使用
tee
和进程替换:

构造
>(…)
称为进程替换。它创建了一个类似文件的对象,
tee
可以写入。执行parens中的命令,并将写入该命令的任何内容作为stdin提供给该命令

bash、ksh和zsh支持进程替换。它不是POSIX,不能在dash下工作

简单例子

让我们考虑一下这个简单的脚本:

$ cat myscript 
#!/bin/bash
tee >(grep 1 >out1) >(grep 2 >out2) | grep 3 >out3
我们可以运行它并验证结果:

$ seq 10 | bash myscript
$ cat out1
1
10
$ cat out2
2
$ cat out3
3

John1024答案的一个变体是使用命名管道代替流程替换

mkfifo p1 p2 p3
tee p1 p2 p3 > /dev/null & # or tee p1 p2 > p3 &
php script1 < p1 > out1 &
php script2 < p2 > out2 &
php script2 < p3 > out3 &
wait
rm p1 p2 p3
mkfifo p1 p2 p3
三通p1 p2 p3>/dev/null&#或三通p1 p2>p3&
php脚本1out1&
php脚本2out2&
php脚本2out3&
等待
p1 p2 p3室

(进程替换是一种有效的方法,在某些实现中,它实际上是对创建、管理和清理显式命名管道的语法支持。)

我听说这是一种方法,您不需要多个
tee
命令。您可以为单个命令提供多个
(…)
参数。您能再解释一下
(…)
吗?“我从未见过这种情况。”娜奥米克,我在上次更新中对此做了一些解释。您可能需要刷新浏览器才能看到它。如果有帮助,请告诉我。看到非快捷版本非常酷。非常感谢。@chepner,问题是它们是在文件系统中创建的,并且是文件名与其他进程冲突以及权限失败的主题。也许,我们应该使用tmp文件使解决方案更加健壮。
$ seq 10 | bash myscript
$ cat out1
1
10
$ cat out2
2
$ cat out3
3
mkfifo p1 p2 p3
tee p1 p2 p3 > /dev/null & # or tee p1 p2 > p3 &
php script1 < p1 > out1 &
php script2 < p2 > out2 &
php script2 < p3 > out3 &
wait
rm p1 p2 p3