Tak więc usunąłem mój folder domowy (a ściślej wszystkie pliki, do których miałem dostęp do zapisu). Stało się to, że miałem
build="build"
...
rm -rf "${build}/"*
...
<do other things with $build>
w skrypcie bash i, po nieużywaniu $build
, usuwając deklarację i wszystkie jej zastosowania - ale rm
. Bash z radością się rozwija rm -rf /*
. Tak.
Czułam się głupio, zainstalowałam kopię zapasową, przerobiłam utraconą pracę. Próbuję przejść obok wstydu.
Zastanawiam się: jakie są techniki pisania skryptów bash, aby takie błędy nie mogły się zdarzyć, a przynajmniej były mniej prawdopodobne? Na przykład, gdybym napisał
FileUtils.rm_rf("#{build}/*")
w skrypcie Rubiego tłumacz narzekałby, że build
nie został zadeklarowany, więc język mnie chroni.
To, co rozważałem w bashu, oprócz korygowania rm
(które, jak wspomina wiele odpowiedzi w powiązanych pytaniach, nie jest bezproblemowe):
rm -rf "./${build}/"*
To zabiłoby moją obecną pracę (repozytorium Git), ale nic więcej.- Wariant / parametryzacja
rm
tego wymaga interakcji, gdy działa poza bieżącym katalogiem. (Nie można znaleźć żadnego.) Podobny efekt.
Czy to jest, czy istnieją inne sposoby pisania skryptów bash, które są „solidne” w tym sensie?
set -u
nie jest tak marszczony, jak set -e
jest, ale nadal ma swoje wady.
#! /usr/bin/env ruby
na górze każdego skryptu powłoki i zapomnij o bash;)
rm -rf "${build}/*
bez względu na to, dokąd idą znaki cudzysłowu.rm -rf "${build}
zrobi to samo z powoduf
.