Portanto, excluí minha pasta pessoal (ou, mais precisamente, todos os arquivos aos quais tive acesso de gravação). O que aconteceu é que eu tinha
build="build"
...
rm -rf "${build}/"*
...
<do other things with $build>
em um script bash e, depois de não precisar mais $build
, remover a declaração e todos os seus usos - mas o rm
. Bash se expande alegremente para rm -rf /*
. Sim.
Eu me senti idiota, instalei o backup, refiz o trabalho que perdi. Tentando superar a vergonha.
Agora, eu me pergunto: quais são as técnicas para escrever scripts bash para que tais erros não ocorram ou sejam pelo menos menos prováveis? Por exemplo, se eu tivesse escrito
FileUtils.rm_rf("#{build}/*")
em um script Ruby, o intérprete teria reclamado por build
não ter sido declarado, então a linguagem me protege.
O que eu considerei no bash, além de encurralar rm
(que, como muitas respostas em perguntas relacionadas mencionam, não é problemático):
rm -rf "./${build}/"*
Isso teria matado meu trabalho atual (um repositório Git), mas nada mais.- Uma variante / parametrização
rm
que requer interação ao atuar fora do diretório atual. (Não foi possível encontrar nenhum.) Efeito semelhante.
É isso ou existem outras maneiras de escrever scripts bash que são "robustos" nesse sentido?
set -u
não é tão desaprovado quanto set -e
é, mas ainda tem suas desvantagens.
#! /usr/bin/env ruby
no topo de todos os scripts de shell e esquecer o bash;) #
rm -rf "${build}/*
não importa para onde vão as aspas.rm -rf "${build}
fará a mesma coisa por causa dof
.