일부 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 스크립트를 작은따옴표로 묶으면 무한 루프에 빠집니다).