进程替换 ECHOS 不需要的“shell 提示符”。我可以禁用它吗?

进程替换 ECHOS 不需要的“shell 提示符”。我可以禁用它吗?

注意:这个问题是由于“进程替换”的异步处理而出现的。脚本响应具有欺骗性,导致许多时间损失。之前相关的帖子在这里:进程替换中的 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 .2just 是为了防止症状虚假消失——pgrepwait运行所需的额外时间可能也足以让异步进程终止)。

内部运行的进程是主脚本的子进程的假设> >(...)仅在与内置函数、函数和组命令一起使用时才成立,请参阅这里更多细节。

相关内容