Linux Bash管道消耗命令
假设我编写了两个Bash脚本,它们打算与这样的管道一起使用,以便于组合:Linux Bash管道消耗命令,linux,bash,shell,unix,Linux,Bash,Shell,Unix,假设我编写了两个Bash脚本,它们打算与这样的管道一起使用,以便于组合: $/foo.sh/tmp/{1,2}|/bar.sh 其中foo.sh将 mkdir文件夹/tmp/one和/tmp/two,以及 echo将每个创建的文件夹路径作为标准输出的新行 并且bar.sh应该 将其STDIN的每一行(例如,作为$folder) sleep2秒,模拟一个小的时间延迟 触摸$folder/bar.txt中的文件 tl;dr:我的foo.shstdout产量几乎总是超过bar.sh的消费率 问题是,我
$/foo.sh/tmp/{1,2}|/bar.sh
其中foo.sh
将
mkdir
文件夹/tmp/one
和/tmp/two
,以及echo
将每个创建的文件夹路径作为标准输出的新行bar.sh
应该
$folder
)sleep
2秒,模拟一个小的时间延迟$folder/bar.txt中的文件
foo.sh
stdout产量几乎总是超过bar.sh
的消费率
问题是,我不希望foo.sh
中的mkdir/tmp/two
命令发生,直到我的bar.sh
消耗完与mkdir/tmp/one
回波输出相对应的stdin。换句话说,我希望发生的事情的顺序应该是:
foo.sh
:mkdir/tmp/one
bar.sh
:touch/tmp/one/bar.txt
(带睡眠)foo.sh
:mkdir/tmp/two
bar.sh
:touch/tmp/two/bar.txt
(带睡眠)我知道Bash管道可能不是解决这个问题的解决方案。我的问题是,这是否仍然可以实现?您可以随意添加任何必要的附加管道或命令,以获得正确的顺序(
xargs
)假设foo.sh
知道bar.sh
在做什么,它只需查看适当的文件即可:
mkdir /tmp/one
# Polling isn't great, but can be replaced with OS-specific tools
# like inotify
until [[ -f /tmp/one/bar.txt ]]; do
sleep 1
done
mkdir /tmp/two
# etc
这并不要求bar.sh
对foo.sh
有任何专门知识。或者,您可以反转“谁知道谁”的顺序,让foo.sh
简单地阻塞固定资源:
mkdir /tmp/one
touch /tmp/barrier
while [[ -f /tmp/barrier ]]; do
sleep 1
done
mkdir /tmp/two
现在,bar.sh
有责任了解/tmp/barrier
,并在创建/tmp/one/bar.txt
后将其删除
无论哪种方式,一方都需要了解另一方才能知道如何发送信号。假设
foo.sh
知道bar.sh
在做什么,它只需查看相应的文件:
mkdir /tmp/one
# Polling isn't great, but can be replaced with OS-specific tools
# like inotify
until [[ -f /tmp/one/bar.txt ]]; do
sleep 1
done
mkdir /tmp/two
# etc
这并不要求bar.sh
对foo.sh
有任何专门知识。或者,您可以反转“谁知道谁”的顺序,让foo.sh
简单地阻塞固定资源:
mkdir /tmp/one
touch /tmp/barrier
while [[ -f /tmp/barrier ]]; do
sleep 1
done
mkdir /tmp/two
现在,bar.sh
有责任了解/tmp/barrier
,并在创建/tmp/one/bar.txt
后将其删除
无论哪种方式,一方都需要了解另一方才能知道如何发送信号。@andlrc:好的。你能详细说明一下,如果没有这一部分,你将如何解决这个问题吗?或者它是如何表现为问题的?如果您确实需要锁步行为,您可以使用coproc或额外命名的管道,让foo.sh等待,直到收到通知continue@thatotherguy你介意再解释一下如何使用coproc来解决这个问题吗?@andlrc:好的。你能详细说明一下,如果没有这一部分,你将如何解决这个问题吗?或者它是如何表现为问题的?如果您确实需要锁步行为,您可以使用coproc或额外命名的管道,让foo.sh等待,直到收到通知continue@thatotherguy你介意就如何使用coproc来解决它给出一些额外的解释吗?是的,我听到了@chepner。然而,它本质上会使我的
foo.sh
脚本在独立的情况下没有真正的用处。假设“假设foo.sh
知道bar.sh
在做什么”这一部分实际上是我要解决的问题的关键。我想看看是否有可能不以一种明确的方式拥有这种知识。是的,我听到你@chepner。然而,它本质上会使我的foo.sh
脚本在独立的情况下没有真正的用处。假设“假设foo.sh
知道bar.sh
在做什么”这一部分实际上是我要解决的问题的关键。我想看看是否有可能不以一种明确的方式掌握这种知识。