Manchmal benutze ich, $PROJECT_HOME/*
um alle Dateien im Projekt zu löschen. Wenn die Umgebungsvariable PROJECT_HOME
nicht festgelegt ist (da dies su
der Fall war und der neue Benutzer diese Umgebungsvariable nicht festgelegt hat), werden alle Dateien aus dem Stammordner gelöscht. Das ist apokalyptisch.
Wie kann ich konfigurieren, bash
um Fehler auszulösen, wenn ich eine undefinierte Umgebungsvariable in der Shell verwende?
bash
shell
environment-variables
Gemeinschaft
quelle
quelle
set -u
werde tun was du willst.[ -z "$VAR" ]
funktioniert auch mit einem nicht initialisiertenVAR
. Die Initialisierung sollte nur das unerwünschte Verhalten aufzeigen. Mein Punkt ist, wenn Ihre Vars jemals auf irgendeine Weise mit leeren Zeichenfolgen initialisiert werden und Sierm -r "$PROJECT_HOME"/*
versehentlich darauf vertrauenset -u
, werden Sie das "apokalyptische" Verhalten erhalten. IHMO, es ist besser, auf Nummer sicher zu gehen, wenn es darum geht, den gesamten Inhalt Ihres Computers zu schützen.set -u
ist nicht sicher.PROJECT_HOME=/etc
? Nur nach einem leeren Wert zu suchen, reicht nicht aus, um Katastrophen zu verhindern. Sie sollten keine Variablen von nicht vertrauenswürdigen Benutzern verwenden, wenn Sie als Root ausgeführt werden.Antworten:
In der POSIX-Shell können Sie set -u verwenden :
oder mit Parametererweiterung :
In Ihrem Fall sollten Sie
:?
anstelle von?
auch bei gesetzten aber leeren Variablen ausfallen:quelle
Dies wird auch den Fall erfassen,
PROJECT_HOME
in dem gesetzt ist , aber nichts enthält.Beispiel:
1) Das löscht so ziemlich alles , was Sie können auf Ihrem System löschen (abgesehen von dotfiles innen
/
(es gibt in der Regel nicht vorhanden)):2) Das macht nichts:
Das vollständige Entfernen und Neuerstellen Ihres Projekts zu Hause ist möglicherweise eine weitere Option (wenn Sie auch Punktedateien entfernen möchten):
quelle
-z
ist ok, aber da$PROJECT_HOME
soll ein verzeichnis sein,-d
wäre vielleicht besser.[[ -d $PROJECT_HOME ]] && rm -r "$PROJECT_HOME"
.-d
Prüfung würde diesen Fehler verbergen. Ich denke, es ist besser, wenn es weitergehtrm
undrm
sich laut darüber beschwert.[[ -d $PROJECT_HOME ]] && rm -r "$PROJECT_HOME"
wird im Hintergrund nichts unternommen. Aber[[ -z $PROJECT_HOME ]] || rm -r "$PROJECT_HOME"
löscht stillschweigend "$ PROJECT_HOME", auch wenn es sich um eine Datei handelt, die kein Verzeichnis ist. Das Erhalten einer Fehlermeldung ist nie ein Problem:if [[ -d $PROJECT_HOME ]]; then rm -r "$PROJECT_HOME"; else printf '%s is not a directory\n' "$PROJECT_HOME" >&2; fi
PROJECT_HOME="/."
...Ein anderer Weg dies zu tun:
Es gibt viele Variablensubstitutionen. Die obige ist, wenn "somevar" leer ist (und in diesem Fall versucht sie zu löschen
/tmp/or_this_if_somevar_is_empty/*
).quelle
rm -fr ${ENV_VAR:?suitably caustic message here}/*
, aber es könnte noch wert sein , dass der Wert nicht in das Stammverzeichnis abbildet, unter Hinweis darauf , dass es viele Möglichkeiten , einfache Tests zu unterlaufen://
,/..
,/usr/who/../..
, ...