Có thể đảo ngược một lệnh trong bash shell?


12

Tôi đã tự hỏi nếu có một khả năng (đơn giản) để làm lại / đảo ngược một lệnh đã được thực thi trong bash shell? (để làm cho nó hoàn tác)

Có một cái gì đó tương tự như kết hợp ctrl+ zđể làm lại bất kỳ hành động nào (ví dụ như trong word hoặc LibreOffice)?


8
Câu trả lời ngắn gọn là không. một số lệnh có thể được hoàn nguyên, nhưng không có gì hoàn hảo như vậy.
Archemar

3
như những người khác nói, không có undolệnh nào để có bản sao lưu cập nhật của toàn bộ hệ điều hành là thực sự hữu ích. Khi có sự cố xảy ra, bạn chỉ cần khôi phục trạng thái trước đó. Hãy xem rsnapshot chẳng hạn
Arkadiusz Drabchot

1
Tôi muốn tìm cách hoàn tác lệnh tạm dừng -p
Skaperen 3/03/2015

3
@Joshua Đăng bình luận bằng một lệnh có thể phá hủy dữ liệu của người dùng và không có lời giải thích nào là hành vi không được chấp nhận. Điều đó không buồn cười, nó làm tắc nghẽn trang web và quan trọng nhất là nó nguy hiểm. Đừng làm như vậy nữa.
terdon

2
Tôi muốn hoàn tác shutdownlệnh lol .. không thể tin những câu hỏi như vậy cũng có thể nhận được 8 lượt upvote trong một ngày !!
MagExt 3/03/2015

Câu trả lời:


33

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, mvcó 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 -ichuyển đổi tồn tại, để hỏi bạn trước khi ghi đè. Về mặt kỹ thuật, nghịch đảo cprm, trừ khi một cái gì đó được ghi đè (một lần nữa, -ihỏi bạn về nó). rmlà 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). rmcó nghĩa là rm, nếu bạn muốn chức năng "rác", đó thực sự chỉ làmvvà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 -itrong 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). chroothoặ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ỉ echonê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ỏ echovà 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 -lrtgiú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.


14

Không, không có thứ gọi là "hoàn tác" trong Bash, xin lỗi. Đây là lý do tại sao bạn nên kiểm tra kỹ các lệnh của mình hoặc kiểm tra chúng trên các tệp không quan trọng trước (nếu có thể). Và kiểm tra ba lần nếu bạn đang làm mọi thứ với quyền root;)


1
Ctr + / thực hiện hoàn tác một số lệnh Control nhất định trong thiết bị đầu cuối bash, nhưng không phải tất cả các lệnh đều không thể hoàn tác.
Eric Leschinski

@EricLeschinski Bạn có thể cung cấp bất kỳ tài liệu tham khảo?
Erathiel

Nó bị chôn vùi trong các bình luận trả lời của trang này: skork.com/2009/09/bash-shortcut-for-maximum-productivity Để thấy nó hoạt động, hãy nhập một số từ trên thiết bị đầu cuối. Di chuyển con trỏ còn lại trên một ký tự, nhấn Ctrl-d để xóa bên dưới ký tự, sau đó nhấn Ctrl + / để hoàn tác xóa.
Eric Leschinski

1
Ồ, nhưng đó là một cái gì đó khác về cơ bản với việc hoàn thành một lệnh. Nếu bạn xóa một tệp với rm, tệp đã biến mất, nó đã qua đời, nó đã chết, nó không còn nữa, đó là một tệp cũ (cảnh báo Monty Python). Bây giờ người thân của nó khóc trong đau khổ và bạn không thể hoàn tác hành động của mình. Những gì bạn đang nói là hoàn tác gõ hoặc xóa các ký tự và tôi nghi ngờ đó là một tính năng của trình giả lập thiết bị đầu cuối của bạn. Tôi vừa thử nó trong Terminator và nó hoạt động. Chuyển sang một bảng điều khiển khác (Ctrl + Alt + F1 trong trường hợp của tôi) không cho phép nó hoạt động.
Erathiel

Có lệnh nhập thiết bị đầu cuối hoàn tác và lệnh thiết bị đầu cuối sau khi thực hiện hoàn tác. Tôi đến đây để tìm kiếm trước đây.
Eric Leschinski

11

Không, không có hoàn tác chung, nhưng một số hậu quả có thể đảo ngược hơn những cái khác. Lấy ví dụ rm: về cơ bản nó được sử dụng cho hai mục đích - tránh sự lộn xộn và giải phóng không gian cho các tệp mới. Với một chút may mắn, bạn có thể truy xuất nội dung của tệp bằng các công cụ như extundelete, bởi vì chỉ con trỏ đến phần bắt đầu của tệp bị ghi đè khi bạn chạy rm; các nội dung là ghi đè khi hệ điều hành tái sử dụng không gian (mà có thể xảy ra mili giây hoặc năm sau). Do chức năng này, rmrơi vào giữa một quy mô các hệ thống bị phá hủy ít nhiều. Một mặt có ráccác hệ thống, cung cấp một cách để tránh sự lộn xộn mà không có nguy cơ mất dữ liệu ngay lập tức (vì hoàn tác là không đáng kể). Thậm chí bảo thủ hơn là viết một lần, đọc nhiều hệ thống ("WORM"), trong đó dữ liệu không thể bị xóa hoặc ghi đè theo ý muốn bởi hệ thống ghi vào nó. Ở đầu kia của thang đo là các hệ thống băm nhỏ , ghi đè lên nội dung tệp (thường là nhiều lần) ngoài con trỏ. Tại thời điểm đó, công nghệ khôi phục dữ liệu của bạn có thể chưa tồn tại (và có thể không bao giờ tồn tại).

Vì vậy, bạn có thể thấy công cụ cụ thể được sử dụng nhiều nhất ( rm) không phải là công cụ thay thế duy nhất, nhưng nó cung cấp sự đánh đổi mà hầu hết mọi người dường như đều cảm thấy thoải mái với:

  • Xóa một con trỏ tệp rất nhanh và đóng góp rất ít vào việc làm hỏng đĩa
  • Bạn ít có khả năng hết dung lượng trên các hệ thống được tự động hóa cao
  • Cung cấp rất khiêm tốn, nhưng khác không, bảo vệ quyền riêng tư và ngược lại, đảm bảo phục hồi
  • Độ phức tạp thấp và do đó khả năng xảy ra lỗi hoặc hành vi không mong muốn thấp

Nếu sự đánh đổi mà các công cụ của bạn không thể chấp nhận được đối với bạn, hãy xem xét xung quanh. Có thể có những công cụ hiện có để đưa ra quyết định phù hợp với bạn .


3
Phần duy nhất của câu trả lời này giải quyết câu hỏi là dòng đầu tiên
Alvaro

Chỉ cố gắng giải thích tại sao mọi thứ là như vậy, từ một quan điểm sysadmin.
l0b0

9

Các ứng dụng cung cấp tính năng 'hoàn tác' làm như vậy bằng cách duy trì lịch sử các hành động đã thực hiện và phương pháp đảo ngược hành động hoặc ảnh chụp nhanh trạng thái của đối tượng để khôi phục trạng thái trước đó. Các lệnh được thực thi trong shell thực hiện các hành động trực tiếp hoặc thực thi các lệnh để thực hiện các hành động.

Bản thân shell sẽ không có khả năng hoàn tác các hành động do bất kỳ lệnh hoặc chương trình nào được chạy. Nếu lệnh hoặc chương trình duy trì một lịch sử và có chức năng hoàn tác, thì có lẽ điều đó có thể được sử dụng, nhưng bản thân shell thì không thể.

Ví dụ: nếu bạn chạy rm important_file.txt, điều đó sẽ báo cho trình điều khiển hệ thống tệp "hủy liên kết" tệp trên hệ thống tệp. Shell không thực hiện hành động, nó chỉ gọi rmcái nào.

Trong trường hợp muốn phục hồi một tập tin bị mất, có thể làm như vậy, vì thông thường việc xóa tập tin không thực sự xóa nó, nhưng chỉ xóa tham chiếu đến nó. Sau một thời gian, nội dung của tệp sẽ bị ghi đè khi dữ liệu khác được lưu vào đĩa, nhưng trong một thời gian, tệp gốc có thể được khôi phục bằng các tiện ích có thể tìm và "phát lại" nó.


1

Không, không có, nhưng nếu, nói rằng bạn đã nhầm lẫn với một thư mục đặc quyền gốc và bằng cách nào đó đã làm hỏng thứ gì đó, thì cách tốt nhất của bạn là lưu tất cả các tệp bạn có thể vào USB Drive hoặc Thẻ SD và đặt lại hệ điều hành của bạn từ tệp ISO (nếu bạn vẫn có tệp đó, nếu không, bạn có thể lấy một tệp khác ngoại tuyến ...). Nếu bạn đã xóa một cái gì đó bạn có thể, như Wraeth đã nói, hãy tải xuống một ứng dụng để gửi lại dữ liệu tệp vào tên tệp và lưu nội dung tệp (xem câu hỏi này tại đây ). Để có câu trả lời sâu hơn, bạn có thể cho chúng tôi biết bạn đã làm gì sai không?


1

Tôi sẽ không nhắc lại những gì người khác đã nói, nhưng tôi có thể thấy bạn đang đến từ đâu. Cách tiếp cận tiêu chuẩn của tôi để thực hiện các lệnh "nguy hiểm" luôn là lặp lại chúng để xem liệu tất cả các biến có được mở rộng đúng hay không. Nếu bạn có thể trích dẫn một số trường hợp cụ thể, chúng tôi có thể giúp thêm.

Ví dụ: trong một tình huống như:

for i in $(cat /my/file); 
do 
   echo "Now removing file $i using rm -f $i"
done

1

Giống như các câu trả lời tốt khác đã nói: không có "hoàn tác" trong vỏ. Nhưng trong trường hợp sử dụng cụ thể của bạn, để hoàn tác a shutdown, bạn có thể tắt quá trình tắt máy: xem /programming//a/526330

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.