Eu gostaria de escrever um script de shell que verifique se um determinado arquivo archived_sensor_data.json
existe, e, se houver, o exclui. Seguindo http://www.cyberciti.biz/tips/find-out-if-file-exists-with-conditional-expressions.html , tentei o seguinte:
[-e archived_sensor_data.json] && rm archived_sensor_data.json
No entanto, isso gera um erro
[-e: command not found
quando tento executar o test_controller
script resultante usando o ./test_controller
comando O que há de errado com o código?
Respostas:
Está faltando um espaço necessário entre o suporte e
-e
:fonte
[ -e archived_sensor_data.json ] && rm archived_sensor_data.json
. O script parece funcionar agora.if [ -e "$1" ]
(argumento de entrada do nome do arquivo).Aqui está um método alternativo usando
ls
:Se você deseja ocultar qualquer saída,
ls
para ver apenas sim ou não, redirecionestdout
estderr
para/dev/null
:fonte
ls
for bem-sucedido, existe esse arquivo, caso contrário, não há". Sels
falhar, isso não significa que o arquivo está ausente. Pode haver algum outro erro. Por exemplo, crie um arquivo no diretório de propriedade do root e tente fazê-lols
como usuário comum. Ele falharáPermission denied
, o que não é equivalente ao fato de o arquivo não existir.O pano de fundo da minha recomendação de solução é a história de um amigo que, até a segunda semana de seu primeiro trabalho, limpou metade de um servidor de build. Portanto, a tarefa básica é descobrir se existe um arquivo e, se houver, vamos excluí-lo. Mas existem algumas corredeiras traiçoeiras neste rio:
Tudo é um arquivo.
Os scripts têm poder real apenas se resolverem tarefas gerais
Para ser geral, usamos variáveis
Costumamos usar -f force em scripts para evitar intervenção manual
E também ame -r recursivo para garantir a criação, cópia e destruição em tempo hábil.
Considere o seguinte cenário:
Temos o arquivo que queremos excluir: filesexists.json
Este nome de arquivo é armazenado em uma variável
Também temos uma variável de caminho para tornar as coisas realmente flexíveis
Então, vamos ver se
-e
faz o que deveria. Os arquivos existem?Faz. Magia.
No entanto, o que aconteceria, se a variável do arquivo fosse acidentalmente avaliada como nuffin '
O que? É suposto retornar com um erro ... E este é o começo da história de como toda a pasta foi excluída por acidente
Uma alternativa poderia ser testar especificamente o que entendemos ser um 'arquivo'
Portanto, o arquivo existe ...
Portanto, este não é um arquivo e, talvez, não desejemos excluir esse diretório inteiro
man test
tem o seguinte a dizer:fonte
Internamente, o comando rm deve testar a existência do arquivo de qualquer maneira,
então por que adicionar outro teste? Apenas emitir
e desaparecerá depois disso, esteja lá ou não.
Use rm -f é que você não deseja nenhuma mensagem sobre arquivos inexistentes.
Se você precisar executar alguma ação se o arquivo NÃO existir, deverá testá-lo por conta própria. Com base no seu código de exemplo, este não é o caso nesta instância.
fonte
Se você estiver usando um NFS, "test" é uma solução melhor, porque você pode adicionar um tempo limite, caso o seu NFS esteja inoperante:
Uma construção "[-e meu_arquivo]" será congelada até que o NFS esteja funcional novamente:
fonte
test
e[
são sinônimos. Você pode usartimeout
com[
tão bem, etest
também congela se trava NFS.