注意:这个问题是由于“进程替换”的异步处理而出现的。脚本响应具有欺骗性,导致许多时间损失。之前相关的帖子在这里:进程替换中的 cat 挂起:它在等什么?
Bash 4.4.19(1)-发布
使用此代码是因为我无法使用管道。
func() {
in=$(cat)
echo "'this is it: $in'"
}
echo "a string" > >(func)
不幸的是,这个过程替换正在将提示与我的字符串一起打印。
user@srv:~$ ./test.sh
user@srv:~$ 'this is it: a string'
这对我的使用来说是不合需要的!至少可以说!!!
理想的是像这样的正常行为:
user@srv:~$ ./test.sh
'this is it: a string'
我可以强制 Process Substitution 不打印 shell 提示符吗?
注意:我不能使用管道......它给我带来了其他问题。 这些是它造成的问题: 我可以在将命令输出发送到文件(一行)之前对其进行处理吗?
答案1
发生这种情况是因为您的脚本在进程替换的子进程之前返回>(...)
,该进程运行异步地(即在后台)并且只会在您调用脚本的 shell 已经打印其提示符后才打印其内容。
解决办法是wait
:不幸的是,在子 shell 等中运行的进程不作为作业的一部分进行管理,并且不会出现在bash
的作业表中,因此您必须使用pgrep -P
(find-by-parent):
func() {
in=$(cat)
sleep .2
echo "'this is it: $in'"
}
echo "a string" > >(func)
wait $(pgrep -P $$)
(我添加了sleep .2
just 是为了防止症状虚假消失——pgrep
和wait
运行所需的额外时间可能也足以让异步进程终止)。
内部运行的进程是主脚本的子进程的假设> >(...)
仅在与内置函数、函数和组命令一起使用时才成立,请参阅这里更多细节。