如何确保bash管道进程不重叠?

如何确保bash管道进程不重叠?,bash,Bash,如何确保在bash管道中 bash>foo | bar bar仅在foo完成后启动?管道不是这样工作的foo | bar总是同时运行foo和bar,因为它将foo的输出连接到bar的输入,如果有缓冲区的话,缓冲区最小 如果要单独运行它们,请不要使用管道;而是将输出写入文件: foo >out bar <out foo>out bar管道不是这样工作的foo | bar总是同时运行foo和bar,因为它将foo的输出连接到bar的输入,如果有缓冲区的话,缓冲区最小 如果要单独

如何确保在bash管道中

bash>foo | bar

bar
仅在
foo
完成后启动?

管道不是这样工作的
foo | bar
总是同时运行
foo
bar
,因为它将
foo
的输出连接到
bar
的输入,如果有缓冲区的话,缓冲区最小

如果要单独运行它们,请不要使用管道;而是将输出写入文件:

foo >out
bar <out
foo>out

bar管道不是这样工作的
foo | bar
总是同时运行
foo
bar
,因为它将
foo
的输出连接到
bar
的输入,如果有缓冲区的话,缓冲区最小

如果要单独运行它们,请不要使用管道;而是将输出写入文件:

foo >out
bar <out
foo>out

bar该管道用于将foo的输出连接到bar的输入。如果foo完成,bar将无法获得任何输入

也许你想要的只是

foo ; bar
如果bar需要使用
foo
的输出,那么中间文件就是一种解决方案。另一种方法是,如果grep
的参数是硬编码的,则使用括号

ps aux | grep [p]attern
另一种解决方案是安装并使用
[buffer][1]
命令

foo | buffer -m ... | bar

使用
-m…
缓冲区的大小足以容纳
foo
命令的输出。

管道用于将foo的输出连接到bar的输入。如果foo完成,bar将无法获得任何输入

也许你想要的只是

foo ; bar
如果bar需要使用
foo
的输出,那么中间文件就是一种解决方案。另一种方法是,如果grep
的参数是硬编码的,则使用括号

ps aux | grep [p]attern
另一种解决方案是安装并使用
[buffer][1]
命令

foo | buffer -m ... | bar

使用
-m…
缓冲区的大小足以容纳
foo
命令的输出。

管道的工作方式,
foo
bar
在两个单独的子壳中运行。因此,只要
foo
提供了输出,
bar
就能够使用它(通过读取其
stdin
——因为基于管道的IPC,在两个单独的子shell上运行的进程之间的通信完全使用FIFO队列,该队列用于将
stdout
foo
发送到
bar
stdin
。因此,在这种情况下,
bar
不知道或关心不是
foo
结束。它只关心其
stdin
上放置的内容


如果你关心
foo
的完成,你必须对
foo
bar
使用另一种类型的调用。

管道的工作方式,
foo
bar
在两个单独的子shell中运行。因此,只要
foo
提供了输出,
bar
就可以使用它(通过读取其
stdin
——因为基于管道的IPC,在两个单独的子shell上运行的进程之间的通信完全使用FIFO队列,该队列用于将
stdout
foo
发送到
bar
stdin
。因此,在这种情况下,
bar
不知道或关心不是
foo
结束。它只关心其
stdin
上放置的内容


如果您关心
foo
的完成,则必须对
foo
bar
使用另一种类型的调用。

不能使用管道,因为它们总是同时运行。使该机制工作的正确方法是使用缓冲区:

buffer=$(foo)
echo "$buffer" | bar


bar不能使用管道,因为它们总是同时运行。使该机制工作的正确方法是使用缓冲区:

buffer=$(foo)
echo "$buffer" | bar


bar不是一个编程问题,而是一个操作系统问题。为什么要这样做?如果您依赖于
foo
的输出文件,那么不要使用管道。@MarkGaleck,如果您使用的是
ps | grep
,那么根本不要这样做;而是使用
pgrep
,它足够聪明,可以排除自身。(虽然,实际上,
pgrep
的大多数用法也可以用更好的替代方法来替代——锁文件、基于进程树的维护等更好的替代方法)@MarkGaleck,请解释一下您实际要完成的任务是什么?如果是“检查进程是否已退出以重新启动它”例如,流程树感知监控系统是正确的。如果这是“确保另一个流程已完成”,则建议锁定是正确的(并且尝试对作业使用
ps
,实际上会造成竞争条件错误)。为作业使用正确的工具是很重要的,如果你不告诉我们作业是什么…不是编程问题而是操作系统问题,为什么要这样做?如果你依赖于
foo
的输出文件,那么就不要使用管道。@MarkGaleck,如果你使用的是
ps | grep
,根本不要这样做;使用
pgrep
相反,它足够聪明,可以将自己排除在外。(虽然,实际上,
pgrep
的大多数用法也可以用更好的替代方法来代替——锁文件的更好替代方法,基于进程树的维护,等等)@MarkGaleck,请解释一下您实际想要实现的目标?如果是这样的话“检查流程是否已退出以重新启动”,例如,流程树感知监控系统是正确的做法。如果这是“确保另一个流程已完成”,则建议锁定是正确的做法(尝试使用作业的
ps
实际上会造成争用条件错误).为工作使用正确的工具是很重要的,如果你不告诉我们工作是什么…谢谢你,查尔斯。我的问题基本上是,可以避免同时运行它们,但相反,订购它们。我想你的答案是,不,没有这样的选择。谢谢你