Bạn nên hiểu rằng bash
chỉ là một môi trường thực thi. Nó thực thi các lệnh mà bạn gọi - đó không phải là công việc của shell để thậm chí biết lệnh đó làm gì, bạn có thể gọi bất kỳ lệnh thực thi nào bạn muốn. Trong hầu hết các trường hợp, thậm chí còn không rõ việc hoàn tác sẽ làm gì - ví dụ, bạn có thể "hủy" phim không? Bạn có thể "unsend" một e-mail? Chẳng hạn, "hoàn tác chạy firefox" nghĩa là gì? Bạn có thể đóng nó, nhưng dấu trang, tải xuống và lịch sử sẽ không giống nhau.
Nếu bạn chạy một lệnh, nó được thực thi, bất cứ điều gì nó làm. Tùy thuộc vào bạn để biết những gì bạn đang làm. Lưu ý rằng điều này không có nghĩa là các lệnh riêng lẻ không có "hoàn tác" ... chúng có thể - bạn thậm chí có thể viết một hàm bao bọc để làm gì đó để bảo vệ bạn khỏi những sai lầm ngu ngốc.
Chẳng hạn, mv
có thể đảo ngược dễ dàng bằng cách di chuyển tệp trở lại nơi xuất phát, trừ khi bạn đã ghi đè lên một cái gì đó. Đó là lý do tại sao -i
chuyển đổi tồn tại, để hỏi bạn trước khi ghi đè. Về mặt kỹ thuật, nghịch đảo cp
là rm
, trừ khi một cái gì đó được ghi đè (một lần nữa, -i
hỏi bạn về nó). rm
là lâu dài hơn, để cố gắng lấy lại các tập tin, bạn thực sự phải thực hiện một số hack cấp thấp hơn (có các công cụ cho việc đó). Nếu bạn coi hệ thống tập tin là một hộp đen, về mặt kỹ thuật thì hoàn toàn không thể (chỉ các chi tiết về bố cục dữ liệu logic và vật lý mới cho phép bạn thực hiện một số kiểm soát thiệt hại). rm
có nghĩa là rm
, nếu bạn muốn chức năng "rác", đó thực sự chỉ làmv
vào một số thư mục được sắp xếp trước (và có thể là một dịch vụ theo lịch trình để duy trì hoặc làm trống nó) - không có gì đặc biệt về nó. Nhưng bạn có thể sử dụng -i
để nhắc bạn trước khi xóa. Bạn có thể sử dụng một hàm hoặc một bí danh để luôn bao gồm -i
trong các lệnh này.
Lưu ý rằng hầu hết các ứng dụng đang bảo vệ bạn khỏi mất dữ liệu theo những cách khác nhau. Hầu hết (~ tất cả) trình soạn thảo văn bản tạo các tệp sao lưu ~
ở cuối trong trường hợp bạn muốn đưa phiên bản cũ trở lại. Trên một số distro, ls
được đặt bí danh theo mặc định để nó ẩn chúng ( -B
), nhưng chúng ở đó. Rất nhiều sự bảo vệ được đưa ra bằng cách quản lý quyền một cách chính xác: không được root trừ khi bạn cần, làm cho các tệp chỉ đọc nếu bạn không muốn chúng thay đổi. Đôi khi thật hữu ích khi có môi trường "hộp cát" - bạn chạy mọi thứ trên một bản sao, xem nó có ổn không, và sau đó hợp nhất các thay đổi (hoặc từ bỏ các thay đổi). chroot
hoặc làlxc
có thể ngăn các tập lệnh của bạn thoát khỏi một thư mục và làm hỏng.
Khi bạn cố gắng thực hiện hàng loạt thứ - ví dụ, nếu bạn có một lệnh find phức tạp, vòng lặp while, một đường ống dài hoặc bất cứ thứ gì tương tự, thì trước tiên chỉ echo
nên thực hiện các lệnh sẽ được thực thi. Sau đó, nếu các lệnh trông hợp lý, loại bỏ echo
và chạy nó thực sự. Và tất nhiên, nếu bạn thực sự không chắc chắn về những gì bạn đang làm, hãy tạo một bản sao trước. Tôi đôi khi chỉ cần tạo một tarball của thư mục hiện tại.
Nói về tarball - tarbomb và zipbombs khá phổ biến (khi mọi người tạo một kho lưu trữ mà không có thư mục con thích hợp và giải nén các tập tin xung quanh, tạo ra một mớ hỗn độn lớn). Tôi đã quen với việc tự tạo một thư mục con trước khi giải nén (tôi có thể liệt kê nội dung, nhưng tôi lười biếng). Tôi đang suy nghĩ về việc tạo một kịch bản sẽ tạo thư mục con chỉ khi nội dung được lưu trữ mà không có thư mục con. Nhưng khi nó xảy ra, ls -lrt
giúp tìm các tệp gần đây nhất để đặt nơi chúng thuộc về. Tôi chỉ lấy ví dụ này - một chương trình có thể có nhiều tác dụng phụ mà vỏ không có cách nào để biết (Làm thế nào? Đó là một chương trình khác được gọi!) Cách duy nhất chắc chắn để tránh sai lầm là cẩn thận (nghĩ hai lần, chạy một lần).
Có thể các lệnh nguy hiểm nhất là các lệnh liên quan đến hệ thống tập tin: mkfs, fdisk / gdisk, v.v. Họ hoàn toàn có thể phá hủy hệ thống tập tin (mặc dù với phần mềm pháp y thích hợp, ít nhất là kỹ thuật đảo ngược một phần là có thể). Luôn kiểm tra kỹ thiết bị bạn định dạng và phân vùng là chính xác, trước khi chạy lệnh.