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