Bash管道消耗订单

时间:2016-05-25 19:15:56

标签: linux bash shell unix

假设我编写了几个Bash脚本,并且它们可以与这样的管道一起使用,以便于组合:

$ ./foo.sh /tmp/{one,two} | ... <potentially more pipes here, e.g. grep> ... | ./bar.sh

foo.sh

  1. mkdir文件夹/tmp/one/tmp/two以及
  2. echo每个创建的文件夹路径作为stdout的新行
  3. bar.sh应该是

    1. 取其STDIN的每一行(例如,$folder
    2. sleep 2秒,模拟一小段时间延迟
    3. 触摸$folder/bar.txt
    4. 中的文件

      tl; dr:我的foo.sh stdout产量几乎总是超过bar.sh的消费率。

      问题是,我不希望mkdir /tmp/two中的foo.sh命令发生,直到我的bar.sh完成消耗与{{1}对应的标准输入回声输出。换句话说,我想要发生的事情的顺序应该是这样的:

      1. mkdir /tmp/onefoo.sh
      2. mkdir /tmp/onebar.sh(有睡觉)
      3. touch /tmp/one/bar.txtfoo.sh
      4. mkdir /tmp/twobar.sh(有睡觉)
      5. 据我所知,Bash管道可能不是解决此问题的解决方案。我的问题是,这仍然可以实现吗?随意添加使用额外的管道或命令以获得正确的排序(touch /tmp/two/bar.txt浮现在脑海中)。

1 个答案:

答案 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后删除它。

无论哪种方式,都需要一些关于另一方的知识才能知道如何发送信号。