バックグラウンドにあるときにいくつかの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

したがって、2番目の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スクリプトを一重引用符で囲むと無限ループになります)。

おすすめ記事