Linux 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的消费率 问题是,我

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

$/foo.sh/tmp/{1,2}|/bar.sh

其中
foo.sh

  • mkdir
    文件夹
    /tmp/one
    /tmp/two
    ,以及
  • echo
    将每个创建的文件夹路径作为标准输出的新行
  • 并且
    bar.sh
    应该

  • 将其STDIN的每一行(例如,作为
    $folder
  • sleep
    2秒,模拟一个小的时间延迟
  • 触摸
    $folder/bar.txt中的文件
  • tl;dr:我的
    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
    在做什么”这一部分实际上是我要解决的问题的关键。我想看看是否有可能不以一种明确的方式掌握这种知识。