Bagaimana saya bisa mencari sejarah bash dan menjalankan kembali perintah?

297

Bisakah saya mencari riwayat di bash dan menjalankan hasilnya?

Richard Hoskins
sumber

Jawaban:

428

Ketik Ctrl Rpada baris perintah dan mulai mengetik perintah sebelumnya. Setelah hasil muncul terus memukul Ctrl Runtuk melihat pertandingan lainnya. Ketika perintah yang Anda inginkan muncul, cukup tekanEnter

Perhatikan bahwa sementara Ctrl Radalah default, jika Anda ingin perintah ( reverse-search-history) terikat, Ctrl TAnda dapat mengonfigurasinya dengan yang berikut:

bind '"\ Ct": reverse-search-history'

Ada seluruh host perintah bindable readline lain yang tersedia untuk Anda juga. Lihatlah bashhalaman manual .

Bash memiliki banyak fasilitas untuk mencari dan mengakses riwayat perintah interaktif. Yang paling mendasar adalah historybuiltin. Mengetik hanya:

$ sejarah

Akan mencetak daftar perintah bersama dengan indeks numerik, seperti:

$ sejarah
1 jelas
2 ls -al
3 vim ~ / somefile.txt
4 sejarah
$

Anda kemudian dapat menjalankan salah satu dari perintah ini menggunakan indeks numerik mereka dengan memilih indeks dengan satu !, seperti yang ditunjukkan oleh Mitch :

$! 1

Akan menjalankan clearperintah. Builtin sejarah memiliki banyak fitur sendiri, Anda dapat melihat lebih dalam bashdan historymanusia halaman.

Anda juga dapat menentukan offset negatif relatif saat menggunakan !penunjuk, jadi menggunakan daftar riwayat kami di atas, jika kami ingin mengeksekusi vimlagi, kami bisa melakukan:

$! -2

Yang pada dasarnya memberitahu bash untuk mengeksekusi perintah yang Anda jalankan "dua perintah yang lalu." Untuk menjalankan perintah sebelumnya dalam daftar histori, kita bisa menggunakan !!(yang merupakan singkatan untuk !-1).

The !designator tidak membatasi Anda untuk numerik yang menetapkan perintah untuk menjalankan. hayalci menunjukkan bahwa Anda dapat menginstruksikan bashuntuk mengeksekusi perintah berdasarkan teks yang dimulai dengan (menggunakan !) atau teks dalam perintah itu sendiri (menggunakan !?). Sekali lagi, menggunakan contoh daftar riwayat kami di atas, jika kami ingin mengeksekusi clearlagi, yang perlu kami lakukan adalah mengetik:

$! cl

dan tekan Enter. Dan bagaimana vim? Itu sesederhana:

$!? beberapa

Poin terpenting dari respons hayalci adalah panggilan ke shoptbuiltin:

$ shopt -s melakukan histverifikasi

Hal ini akan memungkinkan verifikasi sejarah sehingga perintah yang dicocokkan oleh !, !!dan !?designators tidak membabi buta dieksekusi, melainkan diisi pada baris perintah sehingga Anda dapat memastikan mereka akan tidak melakukan kejahatan sebelum mengeksekusi mereka. Ini bahkan lebih penting ketika Anda menjalankan perintah sebagai pengguna root. Opsi ini dapat diatur dalam .bashrcfile startup Anda sehingga diatur kapan pun Anda masuk.

Seperti yang telah ditunjukkan, semua informasi ini dapat diperoleh dari bashhalaman manual . Untuk!, !!, dan!? perancang, lihat Bagian 9.3 Ekspansi Sejarah .

Komunitas
sumber
39
+1 Saya telah Menggunakan Linux selama lebih dari 12 tahun untuk semua sistem. Saya tidak tahu itu ada. Seandainya saya bisa +10 bagaimana saya bisa melewatkannya ??
Aiden Bell
1
Pada banyak sistem, menekan panah ke atas melakukan hal yang sama.
mas
Jika seseorang mengkonsolidasikan '!', '!!', '!?', 'Sejarah | grep ', dan' ctrl-r 'menjadi jawaban yang komprehensif, saya akan memilihnya
Richard Hoskins
shoptberjalan di bashrc, bukan bash_profile (atau tidak akan diaktifkan untuk shell yang bukan shell login).
Tobu
2
Juga setelah menekan CTRL + R Anda dapat menggunakan CTRL + SHIFT + R beberapa kali untuk melompat kembali ke perintah sebelumnya
Gal Bracha
37

Sebagai alternatif crtl+R, Anda dapat mencari riwayat dengan mengetik

!text

Ini akan mencari sejarah untuk perintah terbaru yang dimulai dengan 'teks'.

Tapi saya sarankan Anda meletakkan ini di. Bashrc Anda untuk mencegah eksekusi perintah yang salah.

shopt -s histverify

Ini menginstruksikan bash sedemikian rupa sehingga, setelah tindakan sejarah apa pun (seperti !!:s/prev_text/after_text), ia menempatkan baris yang dihasilkan ke prompt perintah. Kemudian Anda dapat meninjau atau mengedit perintah, dan tekan Enter sesudahnya.

hayalci
sumber
5
Gunakan teks!? Untuk menjalankan kembali perintah terbaru yang berisi (sebagai ganti diawali dengan) "teks".
mark4o
3
Jika seseorang mengkonsolidasikan '!', '!!', '!?', 'Sejarah | grep ', dan' ctrl-r 'menjadi jawaban yang komprehensif, saya akan memilihnya.
Richard Hoskins
32

Anda juga bisa:

history | grep "stuff"

itu akan mengembalikan sesuatu seperti

num stuff

maka Anda bisa mengetik

!num
Mitch
sumber
15

Saya lebih suka menggunakan history-search-backward daripada reverse-search-history. Yang pertama memungkinkan Anda mengetik beberapa karakter dari perintah kemudian tekan tombol pencarian, sebagai lawan dari menekan tombol pencarian terlebih dahulu kemudian mengetikkan string pencarian.

Secara default pada sistem saya, Mp dan Mn mengikat ke fungsi yang sama tapi saya lebih suka mengikat tombol panah:

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
Keith
sumber
13

Saya memiliki alias yang sangat bagus, h. Ini benar-benar hanya "sejarah | grep", tapi saya menyaring entri "h perintah" sebelumnya dengan "grep -E -v"

alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "

digunakan seperti

h aliases
2003  less .bash_aliases
CurtH
sumber
1
Ini juga dapat dilakukan dengan menambahkan perintah ke HISTIGNORE.
tanenbring
12

Langgan yang sangat baik, Sean! Saya sudah memberikan komentar ini, tetapi saya sedikit malu karena reputasi. :-)

Teknik lain yang terkait dan berguna adalah kemampuan untuk menjalankan perintah sebelumnya sambil mengubah kata. Katakanlah Anda salah ketik nama direktori, atau ingin mengubah nama file:

$ echo namaku bob
nama saya adalah Bob
$ ^ bob ^ jordan
gema nama saya jordan
nama saya jordan

Perhatikan bahwa perintah diperluas, diganti, dan keluaran sebelum perintah dijalankan, jadi jika perintah yang salah dijalankan Anda dapat melihat apa bash pikir itu dilakukan.

Jordan
sumber
6

Karena navigasi melalui riwayat menggunakan Ctrl-r adalah IMO rumit, Anda mungkin ingin mempertimbangkan hh :

https://github.com/dvorka/hstr

yang membuat navigasi lebih sederhana, mudah dan efisien - termasuk menjalankan perintah:

masukkan deskripsi gambar di sini

Martin Dvorak
sumber
Bagaimana cara menggunakannya? Tombol mana yang harus ditekan untuk melihat gambar ini?
Nakilon
2
Setelah Anda menginstal hh Anda dapat menggunakan perintah hh ATAU mengikatnya ke pintasan keyboard apa pun (biasanya Ctrl-r) seperti yang dijelaskan dalam dokumentasi.
Martin Dvorak
itu mengikat ctrl + rsecara default sekarang
Alleo
4

Pada prompt perintah bash, ketik control-R, lalu ketikkan beberapa karakter dari perintah yang Anda inginkan dan fasilitas readline bash akan mencari melalui sejarah perintah untuk perintah itu.

Setelah Anda memulai pencarian, Anda bisa mengetikkan control-R lagi untuk melompat ke perintah pencocokan berikutnya.

John1024
sumber
3

Jika shell Anda telah dikonfigurasikan untuk menggunakan vibinding kunci ( set -o viatau memiliki set editing-mode vidi $HOME/.inputrc), maka Anda mencari dengan <Esc>/some-command<Return>dan tekan n(berikutnya) atau Shift-n(sebelumnya) untuk menelusuri sejarah baris perintah.

Fernando Basso
sumber
Yang ini paling dekat dengan pengguna vim.
Gabor Marton
2

CTRL+ Rberfungsi dengan baik, seperti yang disarankan @ John1024, tetapi agak membosankan jika banyak perintah terbaru Anda mirip dan Anda ingin cara cepat untuk memindai semuanya. Alternatifnya adalah menggunakan history:

$ history | grep keyword
Mureinik
sumber
0

Saya suka HSTR tapi sepertinya saya tidak bisa menginstalnya kadang-kadang. Jadi saya menulis alias menggunakan fzf yang meniru perilakunya ( hx, untuk "mengeksekusi sejarah")

alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
  • history : baik, dapatkan sejarahnya
  • sed : hapus kolom nomor dari daftar (POSIX)
  • fzf: di sini adalah keajaiban, memungkinkan Anda untuk mencari fuzzy daftar secara interaktif, atau bergerak dengan C-Jdan C-K, kemudian jalankan perintah dengan Enter.
  • --height : mengatur jumlah garis yang ditampilkan.
  • --tac : kembalikan daftar (lebih logis untuk riwayat)
  • --tiebreak=index : menjaga urutan riwayat ketika fzf memperbarui hasil
Biggybi
sumber