백그라운드에 있을 때 일부 sed 명령이 실패함

백그라운드에 있을 때 일부 sed 명령이 실패함

일부 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로 확장됩니다. 쉘 변수는 큰따옴표로 확장됩니다.

백그라운드 작업이 아직 실행되지 않은 경우 아무것도 확장되지 않으며 이는 잘못된 것입니다(sed 스크립트를 작은따옴표로 묶으면 무한 루프에 빠집니다).

관련 정보