Como posso sobrescrever um arquivo e executar um comando se o arquivo realmente mudar?

2

Essencialmente, quero executar um comando e capturar sua saída em um arquivo:

some_cmd > /etc/myservice.conf

e quero executar um comando diferente somente se isso resultar na alteração do conteúdo:

systemctl myservice reload

Deve funcionar literalmente com alguma diferença:

  • Os mesmos dados, ordem diferente
  • Arquivo ainda não existe ou está vazio
  • Nova linha extra adicionada no final
  • O novo arquivo está vazio

Eu estava pensando em algo parecido com tee , por exemplo:

echo "value=1" | overwritediff /etc/myservice.conf && systemctl myservice reload

Eu poderia fazer isso com arquivos temporários e diff , imaginando se há uma maneira mais clara. Realmente, tudo bem se a resposta for "não, escreva um script".

Isso é o que eu farei de outra forma:

some_cmd > /tmp/myservice.conf

diff /etc/myservice.conf /tmp/myservice.conf || (
  mv /tmp/myservice.conf /etc/myservice.conf && systemctl myservice reload
)
    
por gregmac 05.07.2017 / 00:37

1 resposta

1

Que tal um script de shell simples usando sha1sum ?

#!/bin/bash

VALUE=$1
FILE=$2

SUM1=$(sha1sum $FILE)
echo "value=$VALUE" > $FILE
SUM2=$(sha1sum $FILE)

if [[ ! $SUM1 == $SUM2 ]]; then
  echo "Different" #put your command here
fi

Ao executar:

nxr ~ touch filetest
nxr ~ bash sumtest.sh 1 filetest
-> Different
nxr ~ bash sumtest.sh 1 filetest
->
nxr ~ bash sumtest.sh 2 filetest
-> Different
    
por 05.07.2017 / 04:28