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 buildnie 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
rmtego 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 -unie jest tak marszczony, jak set -ejest, ale nadal ma swoje wady.
#! /usr/bin/env rubyna 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.