![某些 sed 命令在后台时失败](https://linux22.com/image/142715/%E6%9F%90%E4%BA%9B%20sed%20%E5%91%BD%E4%BB%A4%E5%9C%A8%E5%90%8E%E5%8F%B0%E6%97%B6%E5%A4%B1%E8%B4%A5.png)
某些sed
命令在后台运行时似乎会失败。下面的最小示例。
一个sed
命令附加append
在以星号开头的一行块之后*
。另一个只是替换一个词。命令的顺序sed
并不重要。
TEXT=$'* first\n'
two_seds(){ echo "$TEXT" | \
sed "$!N;/.*\n\*/! s/\n\(.*\)/\nappend\n\1/;P;D" | \
sed "s/first/second/";}
执行two_seds & wait
结果为:
* second
append
执行时wait & two_seds
产生:
* second
所以第二个sed
命令总是有效,而第一个命令在&
.
虽然现在我知道如何解决这个问题,但我很想了解发生了什么。部分是出于好奇,部分是为了以后在模糊的边缘情况下它不会咬我。
bash
可以在或中重现dash
。跑步:
Ubuntu 18.04
sed (GNU sed) 4.4
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
dash, version 0.5.8-2.10
答案1
"$!"
sed 脚本开头的 ( )"$!N;/.*\n\...
将扩展为最后一个后台作业的 PID。 Shell 变量在双引号内展开。
如果尚未运行后台作业,它将扩展为空,这也是错误的(如果将 sed 脚本放在单引号中,它将进入无限循环)。