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 buildnã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
rmque 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 -unão é tão desaprovado quanto set -eé, mas ainda tem suas desvantagens.
#! /usr/bin/env rubyno 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.