Bash
一些 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
"$!"
sed 腳本開頭的 ( )"$!N;/.*\n\...
將擴展為最後一個後台作業的 PID。Shell 變數在雙引號內展開。如果還沒有執行後台作業,它將擴展為空,這也是錯誤的(如果將 sed 腳本放在單引號中,它將進入無限循環)。