/tmp/test
假设我有以下过程每秒向文件写入一个数字+单引号:
for i in {1..1000} ; do echo $i\' ; sleep 1 ; done > /tmp/test
然后我想tail -f
通过另一个函数使用和运行它。出于测试目的,我正在使用echo
:
tail -f /tmp/test | xargs echo
这给了我以下错误(在输入中不带引号运行它可以正常工作):
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
如果我将 sed 添加到等式中,我根本不会得到任何输出:
tail -f /tmp/test | sed "s/['\"]//g" | xargs echo
有什么想法为什么我在添加后没有得到输出sed
,或者如何在输入之前从输入中删除引号xargs
?
答案1
有很多事情。
首先:“tail -f”永远不会完成,因此“xargs”同样会无限期地保持运行。您可以打开第二个窗口来“kill -HUP”“tail -f”进程,以使“tail -f”和“xargs”完成,从而产生输出。
其次:“xargs”正在缓冲输入,并且没有获得它认为的“完整缓冲区”,因此当输出 1000 秒标记时,它甚至还没有运行一次 echo 命令。如果您希望“xargs”为每个输入行单独运行 echo,则需要向 xargs 添加“-n 1”选项。
至于“xargs”不喜欢单引号,您可以使用选项“-d '\n'”来禁用引号处理,并且仅用换行符分隔输入参数。
答案2
或许
tail -f /tmp/test | sed "s/['\"]//g" | while read line; do
do_something "$line"
done