某些 sed 命令在后台失败

Bof*_*fin 1 bash sed dash shell-script regular-expression

一些 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/";}
Run Code Online (Sandbox Code Playgroud)

执行two_seds & wait结果:

* second
append
Run Code Online (Sandbox Code Playgroud)

执行wait & two_seds产量时:

* second
Run Code Online (Sandbox Code Playgroud)

所以第二个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
Run Code Online (Sandbox Code Playgroud)

piz*_*ect 11

"$!"你的sed脚本的开头("$!N;/.*\n\...)将扩大到最后后台作业的PID。Shell 变量在双引号内展开。

如果还没有运行后台作业,它将扩展为空,这也是错误的(如果将 sed 脚本放在单引号中,它将进入无限循环)。