У меня есть текстовый файл, в котором я сохраняю все свои важные личные данные, такие как пароли всех моих аккаунтов и PIN-коды моих кредитных карт, на случай, если я их забуду. Очевидно, этот файл должен быть зашифрован, поэтому я прибегнул к gpg (GNU Privacy Guard).
Проблема в том, что время от времени мне приходится открывать файл не только для чтения, например, чтобы восстановить забытый пароль, но и для записи, например, чтобы записать пароль для новой учетной записи, созданной на новом сайте. Затем мне нужно удалить старый архив, создать новый архив из обновленного текстового файла и удалить текстовый файл.
Я создал простой скрипт, позволяющий сделать все это за одно действие, но сегодня я обнаружил серьезный недостаток: если я не введу новый пароль (например, введу другую строку, когда программа попросит вас повторить свой выбор), архив, очевидно, не будет создан, так как gpg выдаст сообщение об ошибке, но скрипт пойдет дальше и удалит ваш новый текстовый файл, хотя он уже удалил старый архив в качестве первого действия.
На самом деле сценарий выглядит следующим образом:
rm $1.gpg
gpg -c $1
rm $1
Как можно избежать этого, введя цикл управления, который подсчитывает сообщения об ошибках gpg, распознавая, когда что-то пошло не так и новый архив не был создан?
Я знаю, что могу просто удалить первую строку, но я бы не хотел отвечать «да» на сообщение о перезаписи каждый раз, поскольку я знаю, что архив уже существует. Кроме того, я бы хотел сохранить обновленный текстовый файл вместо старого архива, если произойдет какая-то ошибка, поскольку я не хочу изменять файл еще раз, повторяя редактирование (я мог забыть об этом за это время).
решение1
Если gpg
при возникновении ошибки возвращается ненулевой код выхода, вы можете это проверить. Чтобы попробовать, выполните команду gpg
, получите условие ошибки, а затем (предполагая bash
) введите echo $?
. Если вывод не равен 0
, следующее будет выполнено только rm
в том случае, если предыдущая команда (в данном случае gpg
) была успешной:
if [[ $? -eq 0 ]] ; then
rm "$1"
fi
Либо вы можете убедиться, что .gpg
файл существует, прежде чем открывать rm
текстовый файл.
if [[ -f "$1.gpg" ]] ; then
rm "$1"
else
echo "$1.gpg not found, keeping the text file"
fi
Конечно, вы можете объединить оба подхода, гарантируя gpg
успех.идругой файл существует.
Обратите внимание, что вам следует заключать в кавычки любое использование переменных (см. мой код в качестве примера), в противном случае ваш скрипт будет вести себя странно с именами файлов, содержащими, например, пробелы.