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
sumber
ksh
, misalnya, Anda dapat mengedit entri riwayat dan memohonnya tanpa menghapus "versi sebelumnya" dari entri; Anda memiliki semua perintah yang dipanggil tersedia.ksh
kelakuannya berbeda di sini, tampaknya. Dan opsi edit riwayat Anda juga tergantung pada mode pengeditan yang dipilih. Dalamksh
mode-vi, misalnya, entri lama tidak ditimpa, dan saya juga dapat mengeluarkan perintah undo, seperti divi
, dengan 'u'.ksh
, tetapi ada baiknya mengetahui hal seperti itu ada di sana.Jawaban:
Selama Anda telah mengedit entri riwayat tetapi belum menekan Enter, untuk kembali ke entri asli, berulang kali tekan Ctrl+ _-
undo
perintah - hingga tidak membuat perubahan lebih lanjut. Anda kembali ke entri asli.sumber
Kembalikan ke perintah awal ketika Anda telah membuat banyak perubahan pada baris:
M
adalah 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 hanyagrep
dengan$HISTFILE
seperti 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 -l
kemudian ctrl+ rsebanyak yang dibutuhkan untuk menemukan perintah sebelumnya yang Anda cari. Jika Anda menggulir melewatinya, ctrl+ sakan mencari maju dari posisi saat ini.Perintah
fc
bash 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 -l
perintah sebelumnya , ia dapat menyalurkan output kegrep
seperti:fc -l -100 | grep 'ls -l'
Ini akan menampilkan daftar
ls -l
perintah sebelumnya yang didahului dengan nomor indeks. Outputnya terlihat seperti ini:2065 ls -l
Sekarang Anda dapat menggunakan penunjuk acara di
!n
manan
nomor indeks. Dalam contoh ini, mengeksekusi!2065
akan diperluas kels -l
.Meskipun tidak membantu setelah fakta, siapa pun yang ingin melestarikan sejarah perintah saat ini ketika memodifikasi perintah sebelumnya harus melihat
HISTORY EXPANSION
bagianman bash
. Berikut adalah beberapa metode alternatif untuk memodifikasi perintah lama tanpa menimpa sejarah.The
Event Designators
bagian menunjukkan bagaimana Anda dapat dengan mudah mengedit string dari perintah yang terakhir digunakan.Contoh:
Perintah terbaru sekarang akan menunjukkan:
Contoh di atas juga menjelaskan cara menggunakan
sed
untuk mengganti string di event designator.Jadi jika 3 perintah dalam sejarah adalah
echo foo
maka 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.
sumber