Entonces, eliminé mi carpeta de inicio (o, más precisamente, todos los archivos a los que tenía acceso de escritura). Lo que pasó es que tuve
build="build"
...
rm -rf "${build}/"*
...
<do other things with $build>
en un script bash y, después de no necesitarlo más $build
, eliminar la declaración y todos sus usos, pero el rm
. Bash felizmente se expande a rm -rf /*
. Sí.
Me sentí estúpido, instalé la copia de seguridad, rehice el trabajo que perdí. Tratando de pasar la vergüenza.
Ahora, me pregunto: ¿cuáles son las técnicas para escribir scripts de bash para que tales errores no puedan ocurrir, o al menos sean menos probables? Por ejemplo, si hubiera escrito
FileUtils.rm_rf("#{build}/*")
En un guión de Ruby, el intérprete se habría quejado de build
no haber sido declarado, por lo que el lenguaje me protege.
Lo que he considerado en bash, además de acorralar rm
(que, como mencionan muchas respuestas en preguntas relacionadas, no es nada problemático):
rm -rf "./${build}/"*
Eso habría matado mi trabajo actual (un repositorio de Git) pero nada más.- Una variante / parametrización de
rm
eso requiere interacción cuando se actúa fuera del directorio actual. (No se pudo encontrar ninguno). Efecto similar.
¿Es eso, o hay otras formas de escribir scripts de bash que son "robustos" en este sentido?
set -u
no está tan mal visto como set -e
está, pero aún tiene sus problemas.
#! /usr/bin/env ruby
en la parte superior de cada script de shell y olvídate de bash;)
rm -rf "${build}/*
no importar a dónde van las comillas.rm -rf "${build}
hará lo mismo por elf
.