Quindi, ho eliminato la mia cartella home (o, più precisamente, tutti i file a cui avevo accesso in scrittura). Quello che è successo è che ho avuto
build="build"
...
rm -rf "${build}/"*
...
<do other things with $build>
in uno script bash e, dopo non essere più necessario $build
, rimuovendo la dichiarazione e tutti i suoi usi - ma il rm
. Bash si espande felicemente a rm -rf /*
. Sì.
Mi sono sentito stupido, ho installato il backup, ho rifatto il lavoro perso. Cercando di superare la vergogna.
Ora, mi chiedo: quali sono le tecniche per scrivere script bash in modo che tali errori non possano accadere, o almeno siano meno probabili? Ad esempio, avevo scritto
FileUtils.rm_rf("#{build}/*")
in una sceneggiatura di Ruby, l'interprete si sarebbe lamentato di build
non essere stato dichiarato, quindi la lingua mi protegge.
Ciò che ho considerato in Bash, oltre al corraling rm
(che, come menzionano molte risposte in domande correlate, non è problematico):
rm -rf "./${build}/"*
Ciò avrebbe ucciso il mio lavoro attuale (un repository Git) ma nient'altro.- Una variante / parametrizzazione
rm
che richiede interazione quando agisce al di fuori della directory corrente. (Impossibile trovare.) Effetto simile.
È così, o ci sono altri modi per scrivere script bash che sono "robusti" in questo senso?
set -u
non è così malvisto come set -e
è, ma ha ancora i suoi gotchas.
#! /usr/bin/env ruby
in cima a ogni script shell e dimenticare bash;)
rm -rf "${build}/*
non importa dove vanno le virgolette.rm -rf "${build}
farà la stessa cosa a causa delf
.