Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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 是否可以在并行进程上分发标准数据?_Bash_Process_Parallel Processing_Stdin_Xargs - Fatal编程技术网

Bash 是否可以在并行进程上分发标准数据?

Bash 是否可以在并行进程上分发标准数据?,bash,process,parallel-processing,stdin,xargs,Bash,Process,Parallel Processing,Stdin,Xargs,给定以下标准输入的示例: foo bar bar baz === qux bla === def zzz yyy 是否可以在分隔符(在本例中为“==”)上拆分它,并通过stdin将其提供给并行运行的命令 因此,上面的示例输入将导致3个并行进程(例如一个名为do.sh的命令),其中每个实例在STDIN上接收一部分数据,如下所示: do.sh(实例1)通过STDIN接收: do.sh(实例2)通过STDIN接收: do.sh(实例3)通过STDIN接收: 我想使用xargs或GNU-paralle

给定以下标准输入的示例:

foo
bar bar
baz
===
qux
bla
===
def
zzz yyy
是否可以在分隔符(在本例中为“==”)上拆分它,并通过stdin将其提供给并行运行的命令

因此,上面的示例输入将导致3个并行进程(例如一个名为do.sh的命令),其中每个实例在STDIN上接收一部分数据,如下所示:

do.sh(实例1)通过STDIN接收:

do.sh(实例2)通过STDIN接收:

do.sh(实例3)通过STDIN接收:


我想使用xargs或GNU-parallel可以实现类似的功能,但我不知道如何实现。

GNU-parallel可以从版本20110205实现这一功能

cat | parallel --pipe --recend '===\n' --rrs do_stuff

一般来说,没有。这种评估的原因之一是,从文件(而不是终端)读取的标准I/O每次读取数据块——BUFSIZ字节,其中BUFSIZ通常是2的幂,例如512或更大。如果数据在一个文件中,一个进程将读取显示的整个文件-如果其他进程共享相同的打开文件描述(类似于文件描述符,但多个文件描述符可以共享相同的打开文件描述,并且可能处于不同的进程),则其他进程将看不到任何内容,或者,如果它们不共享相同的打开文件描述,则会读取整个相同的文件

因此,您需要一个进程来读取文件,该进程知道它需要将信息打包到三个进程,并且它需要知道如何连接到这三个进程。可能是您的distributor程序运行这三个进程并写入它们各自的管道输入。也可能是分发服务器连接到三个套接字并写入不同的套接字

您的示例没有显示/描述如果标记分隔了37个部分,会发生什么情况

我有一个名为
tpipe
的自制程序,它类似于Unix
tee
命令,但它会将(所有)标准输入的副本写入每个进程,默认情况下也写入标准输出。这可能是您所需要的一个合适的基础(它至少涵盖了它的流程管理部分)。如果您需要副本,请与我联系-查看我的个人资料


如果您使用的是Bash,那么可以使用常规
tee
和进程替换来模拟
tpipe
。请参见此以了解如何操作

有关相同信息的另一个版本,请参见-以及一个名为
pee
的程序链接,该程序非常类似于
tpipe
(基本思想相同,在各个方面的实现略有不同)。

您可以使用。命名管道允许您将标准管道视为文件。您可以有多个命名管道,并让其他程序处理它们


我对命名管道不太熟悉,但我经常在这样的情况下使用它们。

tpipe与pee有什么不同?我写过tpipe,以前从未听说过pee。但我并不惊讶于其他人有同样的基本需求并实现了它。我不确定你是否能猜到通过谷歌搜索“小便”有多难(甚至“site:gnu.org pee”也会出现垃圾邮件)!因此,如果没有该软件的URL,我无法为您进行比较和对比。显示正在使用的
pee
,并显示如何在
bash
中不需要
pee
cat文件| tee>(command1>out1)>(command2>out2)
@Ole:感谢您提供的URL。我注意到,
pee
在几个方面与
tpipe
有不同的语义:最值得注意的是,
tpipe
会一直写入可用管道,直到它们全部关闭,而不是像
pee
那样在第一个错误时停止。如果
bash
在所有感兴趣的平台上都可以可靠地使用,那么
bash
设施就很好,这样我就不用干这项工作了。(我答案后面的URL指向与你相同的符号,但不是同一篇文章)。这个答案可能需要更多的解释:
pipe
导致并行写入stdin而不是传递参数,
recend
是记录结束,即分割字符串,
rrs
代表删除记录开始,即删除
”==\n'
。除此之外,
--保持秩序
也很有用。
qux
bla
def
zzz yyy
cat | parallel --pipe --recend '===\n' --rrs do_stuff