看完之后史蒂芬·基特的回复, xargs 在处理任何输入(例如将其拆分为参数)之前等待接收 stdin 输入。
xargs 如何知道 stdin 输入何时结束,以便它可以开始处理它?
用于-E
指定 stdin 输入的结尾?
没有它,xargs 如何知道它何时结束?有没有超时的情况?
答案1
要读取其输入,xargs
请使用read
函数(另见相应的 Linux 联机帮助页)。
read
将文件描述符中的下一个可用数据读取到调用程序指定的内存区域中。正如 所使用的那样xargs
,read
等待直到数据可用、发生错误或者确定不再有数据可用。在每种情况下,它分别返回正整数、-1 或 0。
要确定何时完成读取其输入(其标准输入或选项指定的输入-a
),xargs
请查找指定的文件结束标记(如果-E
使用了该选项),或从read
.
您可以通过运行来查看此操作的实际效果
printf '%s ' {1..1024} | strace -e read xargs -s 2048 -x
答案2
xargs 如何知道 stdin 输入何时结束,以便它可以开始处理它?
xargs
做不是在开始处理之前等待 stdin 结束:
$ while date +%H:%S; do sleep 1; done | xargs -n2 echo
16:51 16:52
16:53 16:54
16:55 16:56
16:57 16:58
^C
xargs
知道标准输入已经结束,就像任何其他程序一样,例如。 cat(1) 或 tee(1),通过检查 read(2) 的返回值、调用 feof(3) 等,xargs
也会将 stdin 上的读取错误视为文件结尾。