Terkadang saya menggunakan, $PROJECT_HOME/*
untuk menghapus semua file dalam proyek. Ketika variabel lingkungan, PROJECT_HOME
tidak disetel (karena saya lakukan su
dan pengguna baru tidak memiliki set variabel lingkungan ini), itu mulai menghapus semua file dari folder root. Ini apokaliptik.
Bagaimana saya bisa mengkonfigurasi bash
untuk melempar kesalahan, ketika saya menggunakan variabel lingkungan yang tidak terdefinisi di shell?
bash
shell
environment-variables
Komunitas
sumber
sumber
set -u
akan melakukan apa yang Anda inginkan.[ -z "$VAR" ]
bekerja dengan yang tidak diinisialisasiVAR
juga. Inisialisasi itu hanya untuk menunjukkan perilaku yang tidak diinginkan — Maksud saya adalah, jika vars Anda pernah diinisialisasi ke string kosong, dengan cara apa pun, dan Anda menjalankannya denganrm -r "$PROJECT_HOME"/*
mengandalkan kesalahanset -u
, Anda akan mendapatkan perilaku "apokaliptik". IHMO, lebih baik aman daripada menyesal ketika harus melindungi seluruh isi komputer Anda.set -u
tidak aman.PROJECT_HOME=/etc
? Hanya memeriksa nilai kosong tidak cukup untuk mencegah bencana. Anda seharusnya tidak menggunakan variabel dari pengguna yang tidak dipercaya saat menjalankan sebagai root.Jawaban:
Di shell POSIX, Anda dapat menggunakan set -u :
atau menggunakan Ekspansi Parameter :
Dalam kasus Anda, Anda harus menggunakan
:?
bukan?
juga gagal di set tetapi variabel kosong:sumber
Ini juga akan menangkap kasus di mana
PROJECT_HOME
yang diatur tetapi tidak mengandung apa-apa.Contoh:
1) Ini akan menghapus hampir semua yang dapat Anda hapus di sistem Anda (kecuali dotfiles di dalamnya
/
(biasanya tidak ada)):2) Ini tidak akan melakukan apa pun:
Benar-benar menghapus rumah proyek Anda dan membuatnya kembali bisa menjadi pilihan lain (jika Anda ingin menyingkirkan dotfiles juga):
sumber
-z
ok, tapi karena$PROJECT_HOME
seharusnya direktori, mungkin-d
akan lebih baik.[[ -d $PROJECT_HOME ]] && rm -r "$PROJECT_HOME"
.-d
cek akan menyembunyikan kesalahan itu. Saya pikir lebih baik jika terusrm
danrm
mengeluh tentang itu keras-keras.[[ -d $PROJECT_HOME ]] && rm -r "$PROJECT_HOME"
tidak akan melakukan apa-apa, secara diam-diam. Tetapi[[ -z $PROJECT_HOME ]] || rm -r "$PROJECT_HOME"
akan secara diam-diam menghapus "$ PROJECT_HOME", meskipun itu file yang bukan direktori. Mendapatkan pesan kesalahan tidak pernah menjadi masalah:if [[ -d $PROJECT_HOME ]]; then rm -r "$PROJECT_HOME"; else printf '%s is not a directory\n' "$PROJECT_HOME" >&2; fi
PROJECT_HOME="/."
...Cara lain untuk melakukan ini:
Ada banyak substitusi variabel, yang di atas adalah ketika "somevar" kosong (dan dalam hal ini mencoba untuk menghapus
/tmp/or_this_if_somevar_is_empty/*
)sumber
rm -fr ${ENV_VAR:?suitably caustic message here}/*
, tapi mungkin masih layak memeriksa bahwa nilai tidak peta ke direktori root, mencatat bahwa ada banyak cara untuk menumbangkan tes sederhana://
,/..
,/usr/who/../..
, ...