Apakah mungkin untuk membalikkan perintah di bash shell?


12

Saya bertanya-tanya apakah ada kemungkinan (sederhana) untuk mengulang / membalikkan perintah yang dieksekusi di bash shell? (untuk membuatnya dibatalkan)

Apakah ada sesuatu yang mirip dengan kombinasi ctrl+ zuntuk mengulangi tindakan apa pun (misalnya dalam kata atau LibreOffice)?


8
jawaban singkatnya adalah tidak. beberapa perintah mungkin dikembalikan, tetapi tidak ada yang umum dibatalkan.
Archemar

3
seperti yang dikatakan orang lain, tidak ada undoperintah sehingga memiliki cadangan terbaru dari seluruh sistem operasi sangat berguna. Ketika terjadi kesalahan Anda hanya mengembalikan keadaan sebelumnya. Lihatlah misalnya rsnapshot
Arkadiusz Drabczyk

1
Saya ingin menemukan cara untuk membatalkan perintah
-t

3
@ Joshua memposting komentar dengan perintah yang dapat menghancurkan data pengguna dan tidak ada penjelasan perilaku yang tidak dapat diterima. Itu tidak lucu, itu mengacaukan situs dan, yang paling penting, itu berbahaya. Jangan lakukan itu lagi.
terdon

2
Saya ingin membatalkan shutdownperintah lol .. tidak percaya pertanyaan seperti itu juga bisa mendapatkan 8 upvotes dalam sehari !!
MagExt

Jawaban:


33

Anda harus memahami bahwa bashitu hanya lingkungan eksekusi. Itu mengeksekusi perintah yang Anda panggil - itu bukan urusan shell untuk bahkan tahu apa perintahnya, Anda dapat memanggil setiap executable yang Anda inginkan. Dalam kebanyakan kasus, bahkan tidak jelas apa yang akan dilakukan undo - misalnya, dapatkah Anda "membatalkan pemutaran" film? Bisakah Anda "tidak mengirim" email? Apa artinya "membatalkan menjalankan firefox", misalnya? Anda mungkin menutupnya, tetapi bookmark, unduhan, dan riwayat tidak akan sama.

Jika Anda menjalankan perintah, itu dieksekusi, apa pun fungsinya. Terserah Anda untuk mengetahui apa yang Anda lakukan. Perhatikan bahwa ini tidak berarti perintah individual tidak memiliki "undo" ... bisa - Anda bahkan dapat menulis fungsi pembungkus yang melakukan sesuatu untuk melindungi Anda dari kesalahan bodoh.

Misalnya, mvmudah dibalik dengan hanya memindahkan file ke tempat asalnya, kecuali Anda telah menimpa sesuatu. Itu sebabnya -iberalih ada, untuk meminta Anda sebelum menimpa. Secara teknis, kebalikannya cpadalah rm, kecuali ada sesuatu yang ditimpa (sekali lagi, -ibertanya tentang hal itu). rmlebih permanen, untuk mencoba mendapatkan file kembali, Anda harus benar-benar melakukan peretasan tingkat rendah (ada alat untuk itu). Jika Anda menganggap sistem file sebagai kotak hitam, secara teknis tidak akan mungkin sama sekali (hanya detail tata letak data logis dan fisik yang memungkinkan Anda melakukan beberapa kontrol kerusakan). rmberarti rm, jika Anda ingin fungsionalitas "sampah", itu sebenarnya adilmvke beberapa direktori yang telah diatur sebelumnya (dan mungkin layanan terjadwal untuk mempertahankan atau mengosongkannya) - tidak ada yang istimewa tentang itu. Tetapi Anda dapat menggunakan -iuntuk meminta Anda sebelum penghapusan. Anda dapat menggunakan fungsi atau alias untuk selalu disertakan -idalam perintah ini.

Perhatikan bahwa sebagian besar aplikasi melindungi Anda dari kehilangan data dengan berbagai cara. Kebanyakan (~ semua) editor teks membuat file cadangan ~di akhir jika Anda ingin mengembalikan versi yang lama. Pada beberapa distro, lsalias secara default sehingga menyembunyikannya ( -B), tetapi ada di sana. Banyak perlindungan diberikan dengan mengelola izin dengan benar: jangan menjadi root kecuali Anda perlu, buat file hanya-baca jika Anda tidak ingin mereka berubah. Terkadang berguna untuk memiliki lingkungan "kotak pasir" - Anda menjalankan berbagai hal pada salinan, melihat apakah itu baik-baik saja, dan kemudian menggabungkan perubahan (atau mengabaikan perubahan). chrootatau lxcdapat mencegah skrip Anda untuk melarikan diri dari direktori dan merusak.

Ketika Anda mencoba untuk mengeksekusi hal-hal dalam jumlah besar - misalnya, jika Anda memiliki perintah find yang kompleks, sementara loop, pipeline panjang, atau hal-hal seperti itu, adalah ide yang baik untuk terlebih dahulu hanya echoperintah yang akan dieksekusi. Kemudian, jika perintah terlihat masuk akal, hapus echodan jalankan itu nyata. Dan tentu saja, jika Anda benar-benar tidak yakin dengan apa yang Anda lakukan, buat salinannya terlebih dahulu. Saya terkadang hanya membuat tarball dari direktori saat ini.

Berbicara tentang tarballs - tarbombs dan zipbombs cukup umum sayangnya (ketika orang membuat arsip tanpa subdirektori yang tepat, dan membongkar mencerai-beraikan file di sekitar, membuat kekacauan besar). Saya terbiasa membuat subdirektori sendiri sebelum membongkar (saya bisa daftar isinya, tapi saya malas). Saya sedang berpikir untuk membuat skrip yang akan membuat subdirektori hanya jika konten diarsipkan tanpa subdirektori. Tetapi ketika hal itu terjadi, ls -lrtmembantu untuk menemukan file terbaru untuk meletakkannya di tempat. Saya baru saja memberikan ini sebagai contoh - sebuah program dapat memiliki banyak efek samping yang shell tidak memiliki cara untuk mengetahui tentang (Bagaimana mungkin? Ini adalah program yang berbeda dipanggil!) Satu-satunya cara pasti untuk menghindari kesalahan adalah dengan berhati-hati (pikirkan dua kali, jalankan sekali).

Mungkin perintah yang paling berbahaya adalah yang berhubungan dengan sistem file: mkfs, fdisk / gdisk dan sebagainya. Mereka benar-benar dapat menghancurkan sistem file (walaupun dengan perangkat lunak forensik yang tepat, setidaknya rekayasa balik sebagian mungkin dilakukan). Selalu periksa ulang perangkat yang Anda format dan partisi sudah benar, sebelum menjalankan perintah.


14

Tidak, tidak ada yang namanya "undo" di Bash, maaf. Inilah sebabnya mengapa Anda harus memeriksa ulang perintah Anda atau mengujinya pada file yang tidak penting terlebih dahulu (jika memungkinkan). Dan periksa tiga kali jika Anda melakukan sesuatu sebagai root;)


1
Ctr + / melakukan undo untuk perintah Kontrol tertentu di terminal bash, tetapi tidak semua perintah tidak dapat diurungkan.
Eric Leschinski

@EricLeschinski Bisakah Anda memberikan referensi?
Erathiel

Ini terkubur dalam balasan-komentar halaman ini: skorks.com/2009/09/bash-shortcuts-for-maximum-productivity Untuk membuatnya berfungsi, ketik beberapa kata di terminal. Gerakkan kursor ke kiri atas karakter, tekan Ctrl-d untuk menghapus di bawah karakter, lalu tekan Ctrl + / yang membatalkan penghapusan.
Eric Leschinski

1
Oh, tapi itu sesuatu yang secara fundamental berbeda dengan membatalkan perintah. Jika Anda menghapus file dengan rm, file hilang, sudah berlalu, sudah meninggal, tidak ada lagi, itu adalah file-mantan (peringatan Monty Python). Sekarang saudara-saudaranya menangis dalam kesedihan dan Anda tidak dapat membatalkan perbuatan Anda. Apa yang Anda bicarakan adalah membatalkan mengetik atau menghapus karakter dan saya menduga itu adalah fitur emulator terminal Anda. Saya baru saja mencobanya di Terminator dan berhasil. Beralih ke konsol lain (Ctrl + Alt + F1 dalam kasus saya) tidak memungkinkannya berfungsi.
Erathiel

Ada entri perintah terminal yang dibatalkan, dan perintah terminal setelah eksekusi dibatalkan. Saya datang ke sini untuk mencari yang pertama.
Eric Leschinski

11

Tidak, tidak ada pembatalan generik, tetapi beberapa konsekuensi lebih dapat dibalik daripada yang lain. Ambil contoh rm: ini pada dasarnya digunakan untuk dua tujuan - menghindari kekacauan dan membebaskan ruang untuk file baru. Dengan sedikit keberuntungan Anda dapat mengambil isi file menggunakan alat seperti extundelete, karena hanya pointer ke awal file yang ditimpa ketika Anda menjalankan rm; yang konten ditimpa ketika sistem operasi menggunakan kembali bahwa ruang (yang bisa terjadi milidetik atau tahun kemudian). Karena fungsi ini, rmjatuh di tengah skala sistem menjadi lebih atau kurang merusak. Di satu sisi ada sampahsistem, yang menyediakan cara untuk menghindari kekacauan tanpa risiko kehilangan data segera (karena membatalkan itu sepele). Yang lebih konservatif adalah menulis sekali, membaca banyak sistem ("WORM"), di mana data tidak dapat dihapus atau ditimpa sesuka hati oleh sistem yang menulisnya. Di ujung lain dari skala adalah sistem merobek - robek , yang menimpa isi file (biasanya beberapa kali) di samping pointer. Pada saat itu teknologi untuk memulihkan data Anda mungkin belum ada (dan mungkin tidak pernah ada).

Jadi, Anda dapat melihat bagaimana alat khusus yang paling sering digunakan ( rm) bukan satu-satunya alternatif, tetapi alat ini memberikan pertukaran sebagian besar orang yang sepertinya nyaman dengan:

  • Menghapus file pointer sangat cepat, dan memberikan kontribusi sangat sedikit terhadap kerusakan disk
  • Anda cenderung kehabisan ruang pada sistem yang sangat otomatis
  • Memberikan perlindungan privasi yang sangat sederhana, tetapi tidak nol, dan sebaliknya, pemulihan
  • Kompleksitas rendah dan karenanya rendah kemungkinan bug atau perilaku tak terduga

Jika kompromi yang dilakukan alat Anda tidak dapat Anda terima, lihat sekeliling. Kemungkinan ada alat di luar sana yang membuat keputusan yang tepat untuk Anda .


3
Satu-satunya bagian dari jawaban ini yang menjawab pertanyaan adalah baris pertama
Alvaro

Hanya mencoba menjelaskan mengapa semuanya seperti itu, dari sudut pandang sysadmin.
l0b0

9

Aplikasi yang menyediakan fitur 'undo' melakukannya dengan mempertahankan riwayat tindakan yang diambil dan metode membalikkan tindakan atau potret keadaan objek untuk memulihkan keadaan sebelumnya. Perintah yang dijalankan di shell melakukan tindakan langsung atau menjalankan perintah untuk melakukan tindakan.

Shell itu sendiri tidak akan memiliki kemampuan untuk membatalkan tindakan yang dihasilkan dari perintah atau program apa pun yang dijalankan. Jika perintah atau program mempertahankan sejarah dan memiliki fungsi undo, maka mungkin itu bisa digunakan, tetapi shell itu sendiri tidak bisa.

Misalnya, jika Anda menjalankan rm important_file.txt, itu akan memberi tahu pengandar filesystem untuk "memutuskan tautan" file pada sistem file. Shell tidak melakukan tindakan, ia hanya memanggil rmyang melakukan.

Dalam kasus ingin membatalkan penghapusan file yang hilang, dimungkinkan untuk melakukannya, karena biasanya menghapus file tidak benar-benar menghapusnya, tetapi hanya menghilangkan referensi untuk itu. Setelah beberapa saat, konten file akan ditimpa karena data lain disimpan ke disk, tetapi untuk sementara waktu file asli dapat dipulihkan menggunakan utilitas yang dapat menemukan dan "menghubungkan kembali" nya.


1

Tidak, tidak ada, tetapi jika, katakan Anda mengacaukan direktori root privilege dan entah bagaimana mengacaukan sesuatu, daripada taruhan terbaik Anda adalah menyimpan semua file yang Anda bisa ke Drive USB atau Kartu SD dan mengatur ulang sistem operasi Anda dari file ISO (jika Anda masih memilikinya, jika tidak, Anda bisa mendapatkan yang lain offline ...). Jika Anda menghapus sesuatu yang Anda bisa, karena wraeth kata, download aplikasi untuk relink data file nama file dan memiliki file isi disimpan (lihat ini pertanyaan di sini ). Untuk jawaban yang lebih mendalam, dapatkah Anda memberi tahu kami apa yang Anda lakukan salah?


1

Saya tidak akan mengulangi apa yang dikatakan orang lain, tetapi saya bisa melihat dari mana Anda akan datang. Pendekatan standar saya untuk menjalankan perintah "berbahaya" selalu untuk mengulanginya untuk melihat apakah semua variabel diperluas dengan benar atau tidak. Jika Anda dapat mengutip beberapa contoh spesifik, kami mungkin dapat membantu lebih lanjut.

Misalnya, dalam situasi seperti:

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

1

Seperti kata jawaban baik lainnya: tidak ada "undo" di shell. Namun dalam kasus penggunaan khusus Anda, untuk membatalkan ashutdown , Anda dapat mematikan proses penutupan: lihat /programming//a/526330

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.