J'ai donc supprimé mon dossier personnel (ou plus précisément tous les fichiers auxquels j'avais accès en écriture). Qu'est-ce qui s'est passé, c'est que j'avais
build="build"
...
rm -rf "${build}/"*
...
<do other things with $build>
dans un script bash et, après ne plus en avoir besoin $build
, supprimer la déclaration et tous ses usages - sauf le rm
. Bash s'étend joyeusement à rm -rf /*
. Oui.
Je me suis senti stupide, installé la sauvegarde, refait le travail que j'ai perdu. Essayer de dépasser la honte.
Maintenant, je me demande: quelles sont les techniques pour écrire des scripts bash afin que de telles erreurs ne puissent pas se produire, ou du moins soient moins probables? Par exemple, avais-je écrit
FileUtils.rm_rf("#{build}/*")
dans un script en ruby, l'interprète se serait plaint de build
ne pas avoir été déclaré, donc le langage me protège.
Ce que j’ai envisagé lors de bash, outre le corraling rm
(qui, comme le soulignent de nombreuses réponses à des questions connexes, n’est pas sans poser de problèmes):
rm -rf "./${build}/"*
Cela aurait tué mon travail actuel (un dépôt Git) mais rien d’autre.- Une variante / paramétrage de
rm
cette opération nécessite une interaction lorsque vous agissez en dehors du répertoire en cours. (Impossible d'en trouver.) Effet similaire.
Est-ce le cas ou existe-t-il d'autres moyens d'écrire des scripts bash "robustes" en ce sens?
set -u
n'est pas aussi mal vu qu'il l' set -e
est, mais il a toujours ses pièges.
#! /usr/bin/env ruby
en haut de chaque script shell et oublier bash;)
rm -rf "${build}/*
ne pas savoir où vont les guillemets.rm -rf "${build}
fera la même chose à cause de laf
.