一部の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スクリプトを一重引用符で囲むと無限ループになります)。