Awk 当结果准备就绪且不等待剩余作业时退出?

Awk 当结果准备就绪且不等待剩余作业时退出?,awk,sleep,exit,head,Awk,Sleep,Exit,Head,我希望在提供结果后立即退出,而不要等待其他作业。我通过不同的方法提供了三个示例,即awk、head和read。我想在下面的示例中显示“1”后退出,而不必等待睡眠。但这些都不起作用。有人帮我吗 (echo 1; sleep 10; seq 10) | head -n 1 (echo 1; sleep 10; seq 10) | awk -e 'NR==1{print $1;exit}' (echo 1; sleep 10; seq 10) | ./test.sh 其中test.sh为以下值:

我希望在提供结果后立即退出,而不要等待其他作业。我通过不同的方法提供了三个示例,即awk、head和read。我想在下面的示例中显示“1”后退出,而不必等待睡眠。但这些都不起作用。有人帮我吗

(echo 1; sleep 10; seq 10) | head -n 1
(echo 1; sleep 10; seq 10) | awk -e 'NR==1{print $1;exit}'
(echo 1; sleep 10; seq 10) | ./test.sh  
其中test.sh为以下值:

while read -r -d $'\n' x
do
    echo "$x"
    exit
done
使用Bash进程替换进行重构 我想在下面的示例中显示“1”后退出,而不必等待睡眠

默认情况下,在处理管道的下一段之前,请等待每个管道段完成。这通常是预期的行为,因为否则您的命令将无法对每个管道元素的已完成输出执行操作。例如,如果sort不能同时获得所有可用数据,它如何在管道中完成工作

在这种特定的情况下,您可以做您想做的事情,但是您必须重构代码,以便awk从而不是管道中读取。例如:

$ time awk -e 'NR==1 {print $1; exit}' < <(echo 1; sleep 10; seq 10)
1

real    0m0.004s
user    0m0.001s
sys 0m0.002s
因为中的命令是异步运行的。在Bash中异步运行命令时:

shell不会等待命令完成,返回状态为0(true)

但是,请注意,这似乎只是做您想要做的事情。您的其他命令(例如
sleep
seq
)实际上仍在后台运行。您可以通过以下方式对此进行验证:

$ { echo 1 & sleep 10 & seq 10 & } | awk -e 'NR==1 {print $1; exit}'; pgrep sleep
1
14921
如您所见,这允许awk在不等待整个命令列表完成的情况下处理
echo
的输出,但它不会真正缩短命令列表的执行。流程替换仍然可能是正确的解决方案,但知道您有其他选择总是好的。

使用Bash流程替换重构 我想在下面的示例中显示“1”后退出,而不必等待睡眠

默认情况下,在处理管道的下一段之前,请等待每个管道段完成。这通常是预期的行为,因为否则您的命令将无法对每个管道元素的已完成输出执行操作。例如,如果sort不能同时获得所有可用数据,它如何在管道中完成工作

在这种特定的情况下,您可以做您想做的事情,但是您必须重构代码,以便awk从而不是管道中读取。例如:

$ time awk -e 'NR==1 {print $1; exit}' < <(echo 1; sleep 10; seq 10)
1

real    0m0.004s
user    0m0.001s
sys 0m0.002s
因为中的命令是异步运行的。在Bash中异步运行命令时:

shell不会等待命令完成,返回状态为0(true)

但是,请注意,这似乎只是做您想要做的事情。您的其他命令(例如
sleep
seq
)实际上仍在后台运行。您可以通过以下方式对此进行验证:

$ { echo 1 & sleep 10 & seq 10 & } | awk -e 'NR==1 {print $1; exit}'; pgrep sleep
1
14921

如您所见,这允许awk在不等待整个命令列表完成的情况下处理
echo
的输出,但它不会真正缩短命令列表的执行。流程替代仍然可能是正确的解决方案,但知道你有其他选择总是好的。

警告:黄疸的迹象即将出现。我怀疑问题在于,现代shell认为它们需要等待管道中的所有进程退出后才能继续。无论如何,在10秒内,
awk
进程在
ps
中不可见,因此它已终止。我敢肯定,在另一个千禧年,贝壳做了不同的事情;当
awk
退出时,shell将继续使用主shell,而不关心其其他子代的状态(echo…sleep…seq)子shell)。@JonathanLeffler Bash等待管道进程,异步时除外。出于我在下面概述的原因,这对我来说似乎是明智的行为,但是如果给定的shell不支持进程替换,那么协程、异步管道和命名管道可能会提供可行的替代方案。警告:前面有黄疸的迹象。我怀疑问题在于,现代shell认为它们需要等待管道中的所有进程退出后才能继续。无论如何,在10秒内,
awk
进程在
ps
中不可见,因此它已终止。我敢肯定,在另一个千禧年,贝壳做了不同的事情;当
awk
退出时,shell将继续使用主shell,而不关心其其他子代的状态(echo…sleep…seq)子shell)。@JonathanLeffler Bash等待管道进程,异步时除外。出于我在下面概述的原因,这对我来说似乎是明智的行为,但是如果给定的shell不支持进程替换,协同路由、异步管道和命名管道可能会提供可行的替代方案。