Vì vậy, tôi đã xóa thư mục nhà của mình (hoặc chính xác hơn là tất cả các tệp tôi có quyền truy cập ghi). Điều gì đã xảy ra là tôi đã có
build="build"
...
rm -rf "${build}/"*
...
<do other things with $build>
trong một tập lệnh bash và sau khi không còn cần thiết nữa $build
, hãy xóa phần khai báo và tất cả các công dụng của nó - nhưng rm
. Bash vui vẻ mở rộng ra rm -rf /*
. Vâng
Tôi cảm thấy ngu ngốc, cài đặt bản sao lưu, làm lại công việc tôi đã mất. Cố gắng vượt qua sự xấu hổ.
Bây giờ, tôi tự hỏi: các kỹ thuật để viết các tập lệnh bash là gì để những lỗi như vậy không thể xảy ra, hoặc ít nhất là ít có khả năng? Chẳng hạn, tôi đã viết
FileUtils.rm_rf("#{build}/*")
trong một kịch bản Ruby, thông dịch viên sẽ phàn nàn về việc build
không được khai báo, vì vậy có ngôn ngữ bảo vệ tôi.
Những gì tôi đã xem xét trong bash, bên cạnh corraling rm
(mà, như nhiều câu trả lời trong các câu hỏi liên quan đề cập, không phải là không có vấn đề):
rm -rf "./${build}/"*
Điều đó sẽ giết chết công việc hiện tại của tôi (một repo Git) nhưng không có gì khác.- Một biến thể / tham số hóa
rm
yêu cầu tương tác khi hoạt động bên ngoài thư mục hiện tại. (Không thể tìm thấy bất kỳ.) Hiệu ứng tương tự.
Là nó, hoặc có những cách khác để viết các tập lệnh bash "mạnh mẽ" theo nghĩa này?
set -u
không phải là gần như cau mày như vậy set -e
, nhưng nó vẫn có vấn đề.
#! /usr/bin/env ruby
ở đầu của mọi kịch bản shell và quên bash;)
rm -rf "${build}/*
dù dấu ngoặc kép đi đâu.rm -rf "${build}
sẽ làm điều tương tự vìf
.