acrescentando uma linha a um arquivo se ausente

3

Eu gostaria de adicionar uma série de comandos a um Makefile que acrescenta linhas de configuração quando eles ainda não estão presentes. Eu já fiz isso no passado da seguinte forma:

grep -vq "keyword" /a/b/c.conf && echo "abc keyword" >> /a/b/c.conf

Mas estou claramente ignorando alguma coisa. O comando as-is faz com que a linha de configuração seja duplicada quando reexecutada.

Um teste manual mostra que o padrão funciona como esperado:

grep -vq "keyword" /a/b/c.conf && echo "the line is absent"

... imprime a linha está ausente somente quando a linha está realmente ausente. E o comando echo é corretamente não executado quando a linha está presente.

O que estou perdendo?

Observação: Os exemplos acima são condensados para facilitar a leitura. Na realidade, haverá muitos comandos semelhantes. Aqui está o comando específico que eu tentei:

grep -vq "md_module" /etc/httpd/conf.modules.d/00-ssl.conf & & echo "LoadModule md_module modules / mod_md.so" > > /etc/httpd/conf.modules.d/00-ssl.conf

    
por svidgen 26.07.2018 / 04:50

1 resposta

5

O problema é que grep -v corresponderá a linhas que não correspondem à expressão, e não a arquivos que não correspondem a ela ...

Portanto, se o arquivo tiver qualquer linhas que não correspondam a ele, grep -v corresponderá a essas linhas e, assim, o grep retornará com êxito.

Uma abordagem melhor é usar uma correspondência positiva para a palavra-chave e usar || (em vez de && ) para anexar a linha, se necessário:

grep -q "keyword" /a/b/c.conf || echo "abc keyword" >> /a/b/c.conf

Você provavelmente fez seu teste com echo "the line is absent" para dizer que estava ausente quando estava realmente ausente ... E talvez não fazer nada se essa fosse a única linha . Se você testar isso ainda mais, acho que verá que, desde que tenha linhas que não correspondam à palavra-chave, você obterá uma correspondência.

Espero que isso o esclareça!

    
por 26.07.2018 / 05:03