Czasami używam, $PROJECT_HOME/*
aby usunąć wszystkie pliki w projekcie. Gdy zmienna środowiskowa PROJECT_HOME
nie jest ustawiona (ponieważ tak zrobiłem, su
a nowy użytkownik nie ma ustawionej tej zmiennej środowiskowej), rozpoczyna usuwanie wszystkich plików z folderu głównego. To apokaliptyczne.
Jak mogę skonfigurować, bash
aby wyświetlał błąd, gdy używam niezdefiniowanej zmiennej środowiskowej w powłoce?
bash
shell
environment-variables
Społeczność
źródło
źródło
set -u
zrobi co chcesz.[ -z "$VAR" ]
działa również z niezainicjowanymVAR
. Inicjalizacja miała po prostu pokazać niepożądane zachowanie. Chodzi mi o to, że jeśli wasze zmienne zostaną zainicjowane na puste łańcuchy, w jakikolwiek sposób, irm -r "$PROJECT_HOME"/*
błędnie na tym polegacieset -u
, otrzymacie zachowanie „apokaliptyczne”. IHMO, lepiej być bezpiecznym niż żałować, jeśli chodzi o ochronę całej zawartości twojego komputera.set -u
nie jest bezpieczne.PROJECT_HOME=/etc
? Samo sprawdzenie pustej wartości nie wystarczy, aby zapobiec kataklizmowi. Nie należy używać zmiennych od niezaufanych użytkowników podczas uruchamiania jako root.Odpowiedzi:
W powłoce POSIX możesz użyć set -u :
lub używając rozszerzenia parametrów :
W twoim przypadku powinieneś użyć
:?
zamiast?
zawieść również na ustawionych, ale pustych zmiennych:źródło
To również złapie przypadek, w którym
PROJECT_HOME
jest ustawiony, ale niczego nie zawiera.Przykład:
1) Spowoduje to usunięcie prawie wszystkiego, co można usunąć w systemie (z wyjątkiem plików kropek w środku
/
(zwykle nie ma żadnych)):2) To nic nie da:
Całkowite usunięcie projektu domu i odtworzenie go może być kolejną opcją (jeśli chcesz również pozbyć się plików dotfile):
źródło
-z
jest w porządku, ale skoro$PROJECT_HOME
ma to być katalog, być może-d
byłoby lepiej.[[ -d $PROJECT_HOME ]] && rm -r "$PROJECT_HOME"
.-d
Check by ukryć ten błąd. Myślę, że lepiej będzie, jeśli przejdzie dalejrm
irm
narzeka na to głośno.[[ -d $PROJECT_HOME ]] && rm -r "$PROJECT_HOME"
nic nie zrobi, po cichu. Ale[[ -z $PROJECT_HOME ]] || rm -r "$PROJECT_HOME"
po cichu usunie „$ PROJECT_HOME”, nawet jeśli jest to plik, który nie jest katalogiem. Otrzymanie komunikatu o błędzie nigdy nie stanowi problemu:if [[ -d $PROJECT_HOME ]]; then rm -r "$PROJECT_HOME"; else printf '%s is not a directory\n' "$PROJECT_HOME" >&2; fi
PROJECT_HOME="/."
...Inny sposób to zrobić:
Istnieje wiele podstawień zmiennych, powyższe ma miejsce, gdy „somevar” jest puste (w takim przypadku próbuje się usunąć
/tmp/or_this_if_somevar_is_empty/*
)źródło
rm -fr ${ENV_VAR:?suitably caustic message here}/*
, ale może być jeszcze warto sprawdzić, że wartość nie mapuje do katalogu głównego, zwracając uwagę, że istnieje wiele sposobów, aby obalić prostych testów://
,/..
,/usr/who/../..
, ...