Bagaimana cara menelusuri reverse-i-search di BASH?


444

Di terminal, saya bisa mengetik CTRL-Runtuk mencari perintah yang cocok yang sebelumnya diketik dalam BASH. Misalnya, jika saya mengetik CTRL-Rmaka grepadalah daftar grepperintah terakhir saya , dan saya dapat menekan enter untuk menggunakannya. Ini hanya memberikan satu saran. Apakah ada cara untuk menelusuri perintah pencocokan yang diketik sebelumnya lainnya?

Jawaban:


598

Jika saya memahami pertanyaan dengan benar, Anda harus dapat menelusuri alternatif dengan memukul berulang kali Ctrl+R.

Misalnya:

Ctrl+R grep Ctrl+R Ctrl+R ...

Itu mencari mundur melalui sejarah Anda. Untuk mencari maju, gunakan Ctrl+S, tetapi Anda mungkin harus mengatur: stty -ixon(baik dengan .bash_profileatau secara manual) sebelum itu untuk menonaktifkan fitur XON / XOFF yang mengambil alih Ctrl+s. (Lebih detail di sini .)


23
+1 - FYI - Anda juga dapat mencari ke depan sesuai jawaban StackOverflow ini .
Jordan Arseno

7
Dan gunakan Ctrl + Shift + r untuk menggulir mundur jika Anda kebetulan melewatinya.
Wiswit

19
@ww CTRL+SHIFT+rtidak bekerja untuk saya.
Maxim Suslov

9
@MaximSuslov Lihat pertanyaan ini: stackoverflow.com/questions/791765/… Anda dapat menambah [[ $- == *i* ]] && stty -ixon.bashrc Anda dan kemudian CTRL+sakan berfungsi sebagai kebalikan dariCTRL+r
gla3dr

9
@JordanArseno Saya mengambil "search forward" berarti "mencari perintah yang belum saya ketikkan"
Josh Johnson

234

Jika Anda merasa perintah itu akan sering digunakan, Anda bisa menambahkan tag

perintah #useful

Kemudian

ctrl+r #useful

Ini berfungsi karena #merupakan pembatas komentar, yaitu segala sesuatu yang muncul setelah simbol tidak ditafsirkan sebagai perintah. Namun, itu akan dicatat dalam sejarah dan karenanya dapat dicari.


5
Biasanya saya suka penandaan semacam ini. #trg_bld #open_log
Makesh

1
di mana menambahkan tag ini?
Sudip Bhandari

5
@SudipBhandari setelah perintah Anda. # memulai komentar. Misalnya ls -lah # berguna
Andrei

47

Anda juga dapat mengatur panah atas dan bawah untuk melakukan pencarian yang sedikit berbeda dengan menambahkan baris ini ke ~ / .inputrc:

"\e[A": history-search-backward
"\e[B": history-search-forward

Alih-alih mencari substring di mana saja dalam perintah (seperti Ctrl-r ) itu akan mencari perintah yang dimulai dengan teks di sebelah kiri kursor . Misalnya, jika saya menjalankan perintah ini:

$ ls bart
$ ls fools

kemudian ketik lsdan tekan Updua kali, itu akan ditampilkan ls bartdan kursor di tempat yang sama. Bandingkan dengan Ctrl- r, di mana ia akan menemukan lsdua kali pada baris terakhir, jadi Anda harus menekannya sekali lagi untuk menemukan baris sebelumnya.

Kedua pendekatan ini memiliki kekuatan masing-masing, dan keduanya dapat menghemat banyak waktu.


2
Ini juga standar pada OS X, jadi Anda tidak perlu membuat ~/.inputrcdan menambahkan dua baris itu.
DASKAjA

1
Seperti yang ditulis falconepi dalam komentar dari jawaban ini , di Ubuntu Anda hanya perlu menghapus tanda komentar pada ~/.inputrcdua baris termasuk pencarian-sejarah- *
Arpad Horvath

Anda juga dapat melihat posting ini untuk rincian lebih lanjut tentang jawaban ini: codeinthehole.com/writing/…
Andrei

Ini bukan standar di macOS saya (10.13). Saya selalu melewatkan fungsi ini!
sebagainyarin

hal yang baik tentang ini adalah Anda masih dapat menggunakan ctrl-p / ctrl-n untuk membaca sepintas lalu melalui sejarah
syarat

0

Ada pengganti untuk built-in yang Ctrl + Rdisebut hstr . Hal ini memungkinkan untuk mencari riwayat perintah yang cocok dengan semua token pencarian pada saat yang sama (antara lain), dan hasil siklus melalui menggunakan tombol panah:

Contoh

Berikut ini adalah demo screencast .

Itu dapat diinstal pada OS keluarga Debian seperti:

add-apt-repository ppa:ultradvorka/ppa
apt-get update
apt-get install hstr

hstr --show-configuration >> ~/.bashrc

Dan kemudian gunakan Ctrl + R(setelah membuka kembali terminal).

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.