Как сравнить тот же файл и отправить почту в Linux

Я создаю скрипт bash для файла для отправки diff по почте.

для случая ниже, я создал два файла как "xyz.conf" а также "xyz.conf_bkp" Для сравнения, я пришел с приведенным ниже сценарием -

file="/a/b/c/xyz.conf"

while true
do
     sleep 1
     cmp -s $file ${file}_bkp
        if [ $? > 0 ]; then
            diff $file ${file}_bkp > compare.log
            mailx -s "file compare" abc@xyz.com < compare.log
            sleep 2
            cp $file ${file}_bkp
            exit
        fi
done

Я запланировал выше сценарий для запуска каждую секунду

* * * * 0-5 script.sh

Это работает нормально, но я смотрю с другим подходом, как показано ниже - я ищу для работы без создания другого файла резервной копии. Представьте себе, если мне придется работать с несколькими файлами, что приведет меня к созданию тех многих резервных копий, что не выглядит хорошим решением.

Кто-нибудь может подсказать, как реализовать этот подход?

1 ответ

Я бы написал это так.

while cmp "$file" "${file}_bkp"; do
  sleep 2
done
diff "$file" "${file}_bkp" | mailx -s "file compare" abc@xyz.com
cp "$file" "${file}_bkp"

Я хотел избежать запуска обоих cmp а также diff, но я не уверен, что это возможно без временного файла или канала для хранения данных из diff пока вы не определите, если mailx должен бежать.

while diff "$file" "${file}_bkp"; do
  sleep 2
done | {
  mailx -s "file compare" abc@xyz.com
  cp "$file" "${file}_bkp"
  exit
}

diff не будет производить никакого вывода, когда его состояние выхода равно 0, поэтому, когда оно, наконец, имеет ненулевое состояние выхода, его выход передается по конвейеру (как выход while loop) к составной команде, которая выполняется mailx а также cp, Технически, оба mailx а также cp можно как читать из трубы, но mailx исчерпает все данные до того cp работает, и это cp команда все равно проигнорирует свой стандартный ввод.

Другие вопросы по тегам