Как сравнить тот же файл и отправить почту в 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
команда все равно проигнорирует свой стандартный ввод.