Bash

一些 sed 命令在後台失敗

  • November 27, 2018

在後台執行時,某些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 腳本放在單引號中,它將進入無限循環)。

引用自:https://unix.stackexchange.com/questions/484491