Tenho um arquivo de texto no qual salvo todos os meus dados pessoais importantes, como todas as senhas das minhas contas e os PINs dos meus cartões de crédito, caso eu os esqueça. Obviamente, esse arquivo precisa ser criptografado, então recorri ao gpg (GNU Privacy Guard).
O problema é que de vez em quando preciso reabrir o arquivo não só para ler, como recuperar uma senha que esqueci, mas também para escrever, como anotar a senha de uma nova conta que criei em um novo site. Então, preciso excluir o arquivo antigo, criar um novo arquivo a partir do arquivo de texto atualizado e excluir o arquivo de texto.
Criei um script simples para fazer tudo isso com apenas uma ação, mas acabei de encontrar uma grande falha hoje: se eu não conseguir inserir uma nova senha (como inserir uma string diferente quando for solicitado que você repita sua escolha), o arquivo irá obviamente não será criado, pois o gpg dará uma mensagem de erro, mas o script irá além, excluindo seu novo arquivo de texto, quando já havia excluído o arquivo antigo como primeira ação.
O roteiro é na verdade o seguinte:
rm $1.gpg
gpg -c $1
rm $1
Como posso evitar isso, entrando em um ciclo de controle que conta a mensagem de erro do gpg, reconhecendo quando algo deu errado e o novo arquivo não foi criado?
Eu sei que posso remover apenas a primeira linha, mas gostaria de evitar responder 'sim' à mensagem de substituição todas as vezes, pois sei que o arquivo já existe. Além disso, eu gostaria de manter o arquivo de texto atualizado em vez do arquivo antigo se ocorrer algum erro, pois não quero modificar o arquivo novamente, repetindo a edição (talvez eu tenha esquecido dele de qualquer maneira).
Responder1
Se gpg
retornar um código de saída diferente de zero quando ocorrer um erro, você poderá verificar isso. Para tentar, execute o gpg
comando, obtenha uma condição de erro e então (assumindo bash
) digite echo $?
. Se a saída não for 0
, o seguinte será executado apenas rm
se o comando anterior (neste caso gpg
) tiver sido bem-sucedido:
if [[ $? -eq 0 ]] ; then
rm "$1"
fi
Alternativamente, você pode ter certeza de que o .gpg
arquivo existe antes rm
do arquivo de texto.
if [[ -f "$1.gpg" ]] ; then
rm "$1"
else
echo "$1.gpg not found, keeping the text file"
fi
É claro que você poderia combinar as duas abordagens, garantindo o gpg
sucessoeo outro arquivo existe.
Observe que você deve citar qualquer uso de variáveis (veja meu código como exemplo), caso contrário seu script se comportará de maneira estranha com nomes de arquivos contendo, por exemplo, espaços.