Bagaimana cara membatalkan perubahan pada perintah-sejarah?

12

Dalam sistem UNIX Anda dapat menekan panah atas dan bawah untuk menavigasi melalui perintah sebelumnya. Ini sangat berguna.

Terkadang, saya naik dan menemukan perintah yang ingin saya gunakan lagi, tetapi dengan beberapa variasi. Jika saya melakukan perubahan seperti itu, maka saya tidak memiliki cara untuk mendapatkan kembali perintah aslinya, kecuali saya periksa history.

Apakah ada cara untuk "membatalkan" perubahan pada perintah dalam riwayat yang diakses melalui kunci?

Solusi saya saat ini adalah dengan menambahkan a #ke perintah. Dengan cara ini, perintah saat ini dilakukan sebagai komentar, jadi tidak ada yang terjadi. Lalu, saya bisa menelusuri lagi melalui perintah dengan tombol. Masalahnya adalah bahwa perintah yang saya gunakan mungkin terlalu jauh dalam daftar, jadi naik lagi dua ratus kali sedikit. Control + R juga bukan solusi, karena saya mungkin tidak ingat persis apa yang saya cari.

Contoh

Saya mengetik "50 perintah yang lalu" sebagai berikut:

ls -l /etc/httpd/conf/

Sekarang saya naik ke garis itu dan mengubahnya ke

ls -l /etc/init.d/

tetapi tidak menekan enter. Sekarang, saya ingin membahas ls -l /etc/httpd/conf/lagi.

Lingkungan saya

$ echo $SHELL
/bin/bash
$ echo $TERM
xterm
fedorqui
sumber
Bahwa histori perintah diubah kemungkinan adalah fitur (mis-) dari shell yang Anda gunakan. Di ksh, misalnya, Anda dapat mengedit entri riwayat dan memohonnya tanpa menghapus "versi sebelumnya" dari entri; Anda memiliki semua perintah yang dipanggil tersedia.
Janis
Dengan "itu berubah" Maksud saya: diberi perintah sebelumnya yang saya ubah setelah mencapainya dengan panah, jika saya naik dan turun dengan panah, perintah lama tidak akan menunjukkan jalannya, tetapi cara saya memodifikasi Itu. Tentu saja, jika saya mengetik "enter" melakukan perintah, perintah lama itu akan seperti semula; tapi inilah tepatnya yang saya coba hindari dan mencari cara untuk "mereset" perintah ke nilai awalnya.
fedorqui
1
Juga dalam hal ini, kshkelakuannya berbeda di sini, tampaknya. Dan opsi edit riwayat Anda juga tergantung pada mode pengeditan yang dipilih. Dalam kshmode-vi, misalnya, entri lama tidak ditimpa, dan saya juga dapat mengeluarkan perintah undo, seperti di vi, dengan 'u'.
Janis
Uhms, ini kedengarannya sangat menjanjikan. Saya sekarang bekerja di Bash dan saat ini tidak mempertimbangkan untuk berubah ksh, tetapi ada baiknya mengetahui hal seperti itu ada di sana.
fedorqui
Saya ingin tahu di mana bash menyimpan histori perintah terbaru sebelum menulis ke file histori ketika shell ditutup. Mungkin membantu dalam menentukan apakah ini mungkin. Siapa saja? Saya pikir ini mungkin ada di salah satu variabel shell, tetapi tidak punya waktu untuk mempelajari manualnya sekarang.
iyrin

Jawaban:

10

Selama Anda telah mengedit entri riwayat tetapi belum menekan Enter, untuk kembali ke entri asli, berulang kali tekan Ctrl+ _- undoperintah - hingga tidak membuat perubahan lebih lanjut. Anda kembali ke entri asli.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
5

Kembalikan ke perintah awal ketika Anda telah membuat banyak perubahan pada baris:

revert-line (M-r) 
    Undo all changes made to this line. This is like 
executing the undo command enough times to get back to the beginning.

Madalah kunci meta, yang altrbagi saya.


Info Gratis, Belum Bermanfaat

Ketika Anda telah menjalankan perintah seperti yang telah dilakukan OP sebelumnya (hal itu terjadi), tidak ada yang bisa "dibatalkan" karena perintah tersebut ditangani dan diingat oleh pustaka GNU Readline dan tidak akan ditulis$HISTFILE hingga shell keluar. Alasan saya menyebutkan ini adalah karena Anda tidak bisa hanya grepdengan $HISTFILEseperti yang diharapkan dan itu mungkin tidak ideal untuk keluar dari shell.

Jadi di sini ada beberapa opsi untuk menyelamatkan Anda dari menggulir kembali semua perintah readline sebelumnya.

Jika Anda mengingat beberapa perintah , tekan ctrl+ rdan ketik apa yang Anda ingat untuk mencari melalui perintah sebelumnya yang berisi string itu. Menekan ctrl+ rlagi akan menampilkan yang terbaru berikutnya, mencari mundur.

Sebagai contoh, ketik ls -lkemudian ctrl+ rsebanyak yang dibutuhkan untuk menemukan perintah sebelumnya yang Anda cari. Jika Anda menggulir melewatinya, ctrl+ sakan mencari maju dari posisi saat ini.

Perintah fcbash builtin sangat membantu untuk membuat daftar nomor indeks di samping perintah readline sebelumnya.

fc -l -100 akan mendaftar 100 perintah sebelumnya di readline.

Selain itu, jika OP tahu bahwa ia sedang mencari ls -lperintah sebelumnya , ia dapat menyalurkan output ke grepseperti:fc -l -100 | grep 'ls -l'

Ini akan menampilkan daftar ls -lperintah sebelumnya yang didahului dengan nomor indeks. Outputnya terlihat seperti ini:
2065 ls -l

Sekarang Anda dapat menggunakan penunjuk acara di !nmana nnomor indeks. Dalam contoh ini, mengeksekusi !2065akan diperluas ke ls -l.


Meskipun tidak membantu setelah fakta, siapa pun yang ingin melestarikan sejarah perintah saat ini ketika memodifikasi perintah sebelumnya harus melihat HISTORY EXPANSIONbagian man bash. Berikut adalah beberapa metode alternatif untuk memodifikasi perintah lama tanpa menimpa sejarah.

The Event Designatorsbagian menunjukkan bagaimana Anda dapat dengan mudah mengedit string dari perintah yang terakhir digunakan.

^string1^string2^
              Quick  substitution.  Repeat the previous command, replacing string1 with string2.  Equivalent to
              ``!!:s/string1/string2/'' (see Modifiers below).

Contoh:

$ echo foo
foo 
$ ^foo^bar
echo bar
bar

Perintah terbaru sekarang akan menunjukkan:

echo foo
echo bar

Contoh di atas juga menjelaskan cara menggunakan seduntuk mengganti string di event designator.

!-n    Refer to the current command minus n.

Jadi jika 3 perintah dalam sejarah adalah echo foomaka Anda akan menggunakan:
!-3:s/foo/bar

Perhatikan bahwa perancang acara akan muncul dalam riwayat Anda sebagai perintah yang dijalankan, dalam hal ini echo bar. Tidak akan muncul dalam riwayat sebagai !-3:s/foo/bar.

Hanya melempar itu ke luar karena tampaknya terkait erat, bahkan jika itu lebih merupakan "jangan lakukan" daripada solusi "undo" yang dicari OP.

iyrin
sumber
Ini bagus, terima kasih banyak atas informasi terperinci. Saya menerima jawaban Gilles karena melakukan persis apa yang saya cari, sedangkan di sini Anda menganggap saya tahu banyak hal tentang perintah yang ingin saya ulang, yang tidak selalu terjadi.
fedorqui
Ya saya setuju. Akan lebih bagus jika fitur undo diperluas hingga sebelumnya saya memasukkan perintah.
iyrin