Bash并行流水线执行for循环



我想知道是否有一种方法可以在我的生成器发出IFS后立即执行循环的主体。bash的默认行为是诋毁循环,然后执行它

取此代码:

time for i in $(echo 3; sleep 2; echo 1); do sleep ${i}; done

它在6秒内运行。因为bash首先完全执行echo 6; sleep 2; echo 1,并诋毁输入。然后,一旦在这里度过了2秒,echo 1完成了,它就会跟随循环的主体。执行sleep 3,然后执行sleep 1

我希望它能在4秒内运行,因为:

  • 执行第一个echo 3,触发sleep 3
  • 而CCD_ 8执行CCD_
  • sleep 3结束时,循环的主体再次空闲,并且sleep 1执行

注意,我不想要& done,我希望一次执行循环的单个主体,只需要管道生成器+循环执行。

你可能认为& do做到了(因为它与& done相比是明确的(,但事实并非如此,它因语法错误而失败。

注意,我知道我可以用xargs -P或gnu-parallel来实现这一点,但我想知道这是否可以用循环来实现。

我刚刚找到它,还在发帖。要实现这种行为,必须将while循环与read一起使用。与我之前的for循环相当的是:

time (echo 3; sleep 2; echo 1) | while read i; do sleep ${i}; done

在4秒内正确执行。

最新更新