Also habe ich meinen Home-Ordner (oder genauer gesagt alle Dateien, auf die ich Schreibzugriff hatte) gelöscht. Was passiert ist, dass ich hatte
build="build"
...
rm -rf "${build}/"*
...
<do other things with $build>
in einem Bash-Skript und nachdem Sie $build
die Deklaration und alle ihre Verwendungen nicht mehr benötigt haben , entfernen Sie sie - aber die rm
. Bash dehnt sich glücklich aus rm -rf /*
. Ja.
Ich fühlte mich dumm, habe das Backup installiert, die Arbeit, die ich verloren habe, überarbeitet. Der Versuch, die Schande hinter sich zu lassen.
Nun frage ich mich: Was sind Techniken, um Bash-Skripte so zu schreiben, dass solche Fehler nicht auftreten können oder zumindest weniger wahrscheinlich sind? Hatte ich zum Beispiel geschrieben
FileUtils.rm_rf("#{build}/*")
In einem Ruby-Skript hätte sich der Dolmetscher darüber beschwert, dass er build
nicht deklariert wurde, daher schützt mich die Sprache.
Was ich in bash außer dem Korralieren betrachtet habe rm
(was, wie viele Antworten in verwandten Fragen erwähnen, nicht unproblematisch ist):
rm -rf "./${build}/"*
Das hätte meine aktuelle Arbeit (ein Git-Repo) getötet, aber sonst nichts.- Eine Variante / Parametrisierung
rm
davon erfordert Interaktion, wenn Sie außerhalb des aktuellen Verzeichnisses agieren. (Konnte keine finden.) Ähnliche Wirkung.
Ist es das oder gibt es andere Möglichkeiten, Bash-Skripte zu schreiben, die in diesem Sinne "robust" sind?
set -u
ist bei set -e
weitem nicht so verpönt wie es ist, aber es hat immer noch seine Fallstricke.
#! /usr/bin/env ruby
oben in jedes shell script schreiben und bash vergessen;)
rm -rf "${build}/*
wohin die Anführungszeichen gehen.rm -rf "${build}
wird das gleiche wegen der tunf
.