我想知道是否有一种方法可以在我的生成器发出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秒内正确执行。