Cara terbaik untuk mencari melalui sejarah shell

78

Apakah ada cara yang lebih baik untuk mencari perintah histori file daripada grep? Saya memiliki beberapa gagasan tentang apa perintah dimulai, tetapi saya tidak tahu seberapa jauh ke belakang dalam sejarah itu.

pembaruan: sebelumnya adalah zsh spesifik tetapi karena tumpang tindih jawaban, jangan ragu untuk menjawab untuk semua shell (atau mode (vi / emacs)) di sini, catat apakah itu spesifik.

xenoterracide
sumber

Jawaban:

73

Ctrl+ Rbiasanya merupakan cara terbaik, seperti kata deskriptor . Anda juga dapat menggunakan !string, yang menjalankan perintah terbaru yang dimulai dengan string, atau !?string?, yang menjalankan perintah terbaru yang berisi string.

(Saya pikir itu satu-satunya hal yang relevan dengan pertanyaan ini, tapi saya membahas lebih banyak perintah sejarah dalam jawaban ini )

Michael Mrozek
sumber
4
bagaimana Anda membuat 'ctrl + r' terlihat seperti itu?
xenoterracide
13
@ xen <kbd>Ctrl+R</kbd>. sumber jawaban
Michael Mrozek
Saya tidak menyadari mesin SE menerima html terima kasih.
xenoterracide
Saya tidak tahu bahwa kata kunci kbd akan menafsirkan dengan benar "ctrl" dan "+"! Saya biasa menandai setiap tombol secara terpisah. Terima kasih!
Olivier Dulac
2
@OlivierDulac Sayangnya tidak, itu hanya bagaimana saya memformat kunci; seseorang mengedit jawaban saya kemudian untuk menjadikannya kunci yang terpisah
Michael Mrozek
30

Saat menggunakan Bash, ketik Control- Rdan kemudian mulai mengetik. Mengetik Control- Rberulang kali setelah memasukkan beberapa teks akan memindahkan Anda kembali ke baris perintah yang cocok.

Grendel
sumber
18

Tidak yakin apakah ini akan membantu, tapi saya suka menggunakan ctrl- rdan kemudian mulai mengetik perintah. Itu harus melalui sejarah Anda dan memberi Anda pertandingan pertama. Untuk beralih melalui pertandingan cukup tekan ctrl- rlagi.

decriptor
sumber
2
Maaf, lupa tentang zsh. Anda mungkin harus menambahkan pengikat kunci ini ke ~ / .zshrc: bindkey '^ R' history-incremental-search-backward
decriptor
17

Jika Anda menambahkan yang berikut ke ~/.inputrc

"\e[5~": history-search-backward
"\e[6~": history-search-forward

dan mulai ulang Bash, Anda bisa mulai mengetik, lalu gunakan Page Updan Page Downuntuk bergerak maju dan mundur melalui sejarah garis yang dimulai dengan awalan yang sama dengan yang baru saja Anda ketikkan.

(Beberapa mungkin lebih suka menggunakan \e[Adan \e[B, yang akan menggantikan yang normal Updan Downtindakan daripada mengikat kunci baru.)

singkat
sumber
Saya lebih suka memetakan perintah ini ke Alt + Updan Alt + Down. Bergantung pada emulasi keyboard, terminal meniru menggunakan kombinasi ini mungkin dipetakan baik ke \E[Adan \E[A(misalnya Konsol KDE dengan Linux Key Bindings) atau \E[1;3Adan \E[1;3B(mis. Terminal XFCE atau Konsol KDE dengan X Free 4 Bindings).
Christian Herenz
9

Prompt interaktif yang dipanggil oleh Ctrl- R, yang telah disebutkan sebelumnya, adalah cara yang paling nyaman. Selain itu populer untuk memetakan Updan Downpanah tombol untuk mencari riwayat awalan yang saat ini ada di baris perintah, namun ini memerlukan beberapa perubahan pada ~/.inputrcfile .

Solusi klasik dan kurang interaktif adalah dengan menggunakan ekspansi sejarah shell. Mengetik

!foo

akan menjalankan perintah terakhir yang dimulai dengan foodan

!?foo

akan menjalankan perintah terakhir yang berisi foo. Informasi lebih lanjut tentang ekspansi riwayat dapat ditemukan di manual referensi Bash , dengan asumsi shell Anda adalah Bash atau kompatibel.

Adam Byrtek
sumber
6

Jika Anda menambahkan stty -ixonke ~/.bashrcfile Anda kemudian Ctrl- sakan pergi ke arah yang berlawanan ke Ctrl- r.

Dennis Williamson
sumber
Saya ingin menggunakan C-suntuk tujuan ini, tetapi terminal saya membeku ; Waspadalah! (Yah, saya belum pernah mempekerjakan siapa pun stty ixon, tidak yakin untuk apa ini.)
imz - Ivan Zakharyaschev
3
@imz: C-qakan "mencairkan". Ini dan C-smerupakan karakter pengontrol aliran perangkat lunak biasa yang dulunya berguna untuk secara manual menyela (menghentikan sementara) aliran output ketika koneksi serial lambat digunakan. Sekarang output sangat cepat dalam banyak kasus sehingga apa yang ingin Anda lihat ketika Anda menekan C-ssudah digulir oleh. stty -ixonmematikan kontrol aliran perangkat lunak.
Dennis Williamson
Fantastis! Saya telah mencari selama bertahun-tahun cara untuk menggulir maju dalam sejarah seperti ini.
marlar
3

Jika Anda mengetik !lsmaka bash akan memeriksa riwayat Anda dan menjalankan perintah terbaru yang dimulai dengan "ls"

Kevin M.
sumber
2

mungkin spesifik zsh. Dalam meneliti jawaban ini saya menemukan vi-history-search-backward yang memungkinkan seseorang untuk mencari dengan /dalam mode vi (yang saya tidak menyebutkan saya berada di) Anda kemudian dapat menggunakan ndan Nuntuk mencari maju dan mundur masing-masing (setelah menekan enter).

xenoterracide
sumber
2

Saya terkejut ini belum disebutkan - tetapi Anda dapat memilih mode-vi di bash atau ksh dengan melakukan ini:

set -o vi

... atau menggunakan ini sebagai isi ~/.inputrc(untuk readline GNU yang digunakan dalam program seperti bash):

set editing-mode vi

Kemudian setelah itu, Anda dapat menggunakan Escuntuk masuk ke mode perintah dan gunakan kuntuk kembali dalam sejarah, dan juntuk maju. Anda juga dapat mencari menggunakan /untuk mencari secara normal, dan ?untuk mencari secara terbalik.

Jika Anda menggunakan ~/.inputrc, maka ini akan bekerja tidak hanya di GNU bash tetapi dalam apa pun yang menggunakan readline GNU seperti CLISP dan mungkin program seperti shell perintah MySQL dan seperti shell CPAN.

Mei
sumber
2

Untuk beralih ke depan saat menggunakan pencarian terbalik (dengan perintah Ctrl-R):

  1. Buka file .bashrc Anda:
    sudo gedit ~/.bashrc

  2. tambahkan baris ini (huruf "f" dapat diganti dengan yang lain yang belum digunakan oleh sistem)

    bind '"\C-f": forward-search-history' 
  3. Tutup file Anda dan perbarui .bashrc Anda (atau buka terminal lain) dengan perintah:
    source ~/.bashrcatau. ~/.bashrc

SEKARANG ANDA BISA PINDAHKAN MAJU DALAM SEJARAH DENGAN SINGKAT: Ctrl + f

Bekerja di Ubuntu 18,04 LTS

Franklin TCHATATH
sumber
1

Saya menggunakan mengikuti dua sebagian besar waktu.
Tetapi harap perhatikan keduanya mencari chars mulai.

  1. tcsh : ketik beberapa charecters dari perintah kemudian Esc+ pitu akan menunjukkan perintah sebelumnya dimulai dengan urutan tombol tekan lagi itu akan menampilkan perintah lain.
  2. ksh : gunakan fc -e - <SPACE> <first few char for your previous >ini akan menjalankan perintah terakhir yang cocok dengan urutan itu.

Saya tidak dapat menemukan sesuatu seperti Ctrl+ Rdi Bash untuk ksh dan tcsh saya.

Hemant
sumber
3
Ctrl + r bekerja sedikit berbeda di ksh daripada Bash. Tekan Ctrl + r lalu ketik string yang Anda cari dan tekan enter . Untuk mencari hal yang sama, tekan Ctrl + r dan masukkan tanpa harus mengetik ulang string. set -o emacsOmong-omong, ini dalam mode.
Dennis Williamson
@Dennis: +1 :-)
Hemant
1

Ada cara untuk menggunakan Ctrl- Rdengan tcsh . Tambahkan yang berikut ini di ~/.cshrc:

bindkey "^r" i-search-back (itu hanya tanda tanda dan huruf r)

Itu penghemat waktu terbesar bagi saya.

hidung besar
sumber
1

jawaban yang mirip dengan @ephemient, tetapi Anda dapat memasukkan .bashrc Anda

bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-foward'

dan ketik bagian dari frasa, dan kemudian gunakan panah atas / bawah untuk menelusuri opsi terbaru yang cocok. Ini adalah perilaku default matlab.

Bagi kebanyakan orang, jika Anda ingin mem-porting pengaturan Anda ke sistem baru, lebih mudah untuk mengingat untuk merobek hanya Anda ~/.bashrcmaka Anda harus merobek itu~/.inputrc

Matt S.
sumber
0

Ya itu ada, setidaknya jika Anda menggunakan zsh. Mulailah mengetik perintah dan kemudian tekan M-p( ESC p) dan itu akan menemukan perintah sebelumnya yang cocok dengan apa yang Anda ketikkan. Tekan lagi untuk menemukan kecocokan berikutnya.

dkagedal
sumber
Jawaban ini dapat dilakukan dengan lebih banyak penjelasan.
phunehehe