假设我编写了几个Bash脚本,并且它们可以与这样的管道一起使用,以便于组合:
$ ./foo.sh /tmp/{one,two} | ... <potentially more pipes here, e.g. grep> ... | ./bar.sh
foo.sh
将
mkdir
文件夹/tmp/one
和/tmp/two
以及echo
每个创建的文件夹路径作为stdout的新行和bar.sh
应该是
$folder
)sleep
2秒,模拟一小段时间延迟$folder/bar.txt
tl; dr:我的foo.sh
stdout产量几乎总是超过bar.sh
的消费率。
问题是,我不希望mkdir /tmp/two
中的foo.sh
命令发生,直到我的bar.sh
完成消耗与{{1}对应的标准输入回声输出。换句话说,我想要发生的事情的顺序应该是这样的:
mkdir /tmp/one
:foo.sh
mkdir /tmp/one
:bar.sh
(有睡觉)touch /tmp/one/bar.txt
:foo.sh
mkdir /tmp/two
:bar.sh
(有睡觉)据我所知,Bash管道可能不是解决此问题的解决方案。我的问题是,这仍然可以实现吗?随意添加使用额外的管道或命令以获得正确的排序(touch /tmp/two/bar.txt
浮现在脑海中)。
答案 0 :(得分:0)
假设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
后删除它。
无论哪种方式,都需要一些关于另一方的知识才能知道如何发送信号。