<Anterior | Conteúdo | Próxima>
Programação Defensiva
É importante verificar as suposições ao programar. Isso significa uma avaliação cuidadosa do status de saída de programas e comandos usados por um script. Aqui está um exemplo, baseado em uma história verídica. Um infeliz administrador de sistema escreveu um script para realizar uma tarefa de manutenção em um servidor importante. O script continha as seguintes duas linhas de código:
cd $ dir_name rm *
cd $ dir_name rm *
Não há nada intrinsecamente errado com essas duas linhas, desde que o diretório nomeado na variável, nome_dir, existe. Mas o que acontece se isso não acontecer? Nesse caso, o cd o comando falha e o script continua para a próxima linha e exclui os arquivos do diretório de trabalho atual. Não é o resultado desejado! O infeliz administrador destruiu uma parte importante do servidor por causa dessa decisão de design.
Vejamos algumas maneiras pelas quais esse design pode ser aprimorado. Primeiro, pode ser sábio fazer a execução de rm dependente do sucesso de cd:
cd $ dir_name && rm *
cd $ dir_name && rm *
Desta forma, se o cd comando falha, o rm comando não é executado. Isso é melhor, mas ainda deixa em aberto a possibilidade de que a variável, nome_dir, não está definido ou está vazio, o que resultaria na exclusão dos arquivos do diretório pessoal do usuário. Isso também pode ser evitado verificando se nome_dir na verdade contém o nome de um diretório existente:
[[-d $ dir_name]] && cd $ dir_name && rm *
[[-d $ dir_name]] && cd $ dir_name && rm *
Freqüentemente, é melhor incluir lógica para encerrar o script e relatar um erro quando uma situação como a acima ocorrer:
# Exclua arquivos no diretório $ dir_name if [[! -d "$ dir_name"]]; então
echo "Não existe tal diretório: '$ dir_name'"> & 2 exit 1
fi
E se ! cd $ dir_name; então
echo "Não é possível fazer cd para '$ dir_name'"> & 2 saída 1
fi
E se ! rm *; então
echo "Falha na exclusão do arquivo. Verifique os resultados"> & 2 saída 1
fi
# Exclua arquivos no diretório $ dir_name if [[! -d "$ dir_name"]]; então
echo "Não existe tal diretório: '$ dir_name'"> & 2 exit 1
fi
E se ! cd $ dir_name; então
echo "Não é possível fazer cd para '$ dir_name'"> & 2 saída 1
fi
E se ! rm *; então
echo "Falha na exclusão do arquivo. Verifique os resultados"> & 2 saída 1
fi
Aqui, verificamos o nome, para ver se é o de um diretório existente, e o
Erros Lógicos
cesso do cd comando. Se qualquer um deles falhar, uma mensagem de erro descritiva será enviada ao erro padrão e o script será encerrado com um status de saída um para indicar uma falha.