alguns comandos sed falham quando no fundo

0

Alguns comandos sed parecem falhar quando executados em segundo plano. Exemplo mínimo abaixo.

Um comando sed anexa append após um bloco de linhas que começam com uma estrela * . O outro apenas substitui uma palavra. A ordem dos comandos sed não importa.

TEXT=$'* first\n'

two_seds(){ echo "$TEXT" | \
    sed "$!N;/.*\n\*/! s/\n\(.*\)/\nappend\n/;P;D" | \
    sed "s/first/second/";}

Executando two_seds & wait resultados para:

* second
append

Ao executar wait & two_seds yields:

* second

Portanto, o segundo comando sed sempre funciona, enquanto o primeiro não faz nada depois de um & .

Embora por enquanto eu saiba como contornar isso, eu adoraria entender o que está acontecendo. Em parte por curiosidade, em parte para que não me morda mais tarde em casos obscuros.

Pode reproduzir em bash ou dash . Executando:

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
    
por Boffin 27.11.2018 / 18:54

1 resposta

10

O "$!" no início do seu script sed ( "$!N;/.*\n\... ) será expandido para o PID do último trabalho em segundo plano. As variáveis do shell são expandidas entre aspas duplas.

Se nenhum trabalho em segundo plano ainda tiver sido executado, ele será expandido para nada, o que também é errado (se você colocar o script sed entre aspas simples, ele será executado em um loop infinito).

    
por 27.11.2018 / 19:07