it-swarm.asia

Bagaimana saya bisa mencari sejarah bash dan menjalankan kembali perintah?

Bisakah saya mencari riwayat di bash dan menjalankan hasilnya?

292
Richard Hoskins

Mengetik CtrlR di baris perintah dan mulai mengetik perintah sebelumnya. Setelah hasilnya muncul terus memukul CtrlR untuk melihat kecocokan lainnya. Ketika perintah yang Anda inginkan muncul, cukup tekan Enter

Catat itu sementara CtrlR adalah default, jika Anda ingin perintah (reverse-search-history) terikat CtrlT Anda dapat mengonfigurasinya dengan yang berikut:

 ikat '"\ C-t": reverse-search-history' 

Ada seluruh Host dari perintah bindable readline lain yang tersedia untuk Anda juga. Lihatlah bash halaman manual .

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

 $ history 

Akan mencetak daftar perintah bersama dengan indeks numerik, seperti:

 $ history 
 1 hapus 
 2 ls -al 
 3 vim ~/somefile.txt 
 4 history 
 $ 

Anda kemudian dapat menjalankan salah satu dari perintah-perintah ini menggunakan indeks numerik mereka dengan prefacing indeks dengan ! tunggal, seperti Mitch tunjukkan:

 $! 1 

Akan menjalankan perintah clear. History builtin memiliki banyak fitur itu sendiri, Anda dapat melihat lebih banyak di halaman manual bash dan history.

Anda juga dapat menentukan offset negatif relatif saat menggunakan penunjuk !, jadi menggunakan daftar riwayat kami di atas, jika kami ingin menjalankan vim lagi, kami dapat 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).

Designator ! tidak membatasi Anda untuk menentukan secara numerik perintah mana yang harus dijalankan. hayalci menunjukkan bahwa Anda dapat menginstruksikan bash untuk mengeksekusi perintah berdasarkan teks yang dimulai dengan (menggunakan !) atau teks dalam perintah itu sendiri (menggunakan !?). Sekali lagi, menggunakan contoh daftar sejarah kami di atas, jika kami ingin menjalankan clear lagi, yang perlu kita lakukan adalah mengetikkan:

 $! cl 

dan tekan Enter. Dan bagaimana dengan vim? Itu sesederhana:

 $!? some 

Poin terpenting dari hayalci respons adalah panggilan ke shopt builtin:

 $ shopt -s histverify 

Ini akan memungkinkan verifikasi riwayat sehingga perintah yang dicocokkan dengan !, !!, dan !? tidak dirancang secara membabi buta, melainkan diisi pada baris perintah sehingga Anda dapat memastikan mereka tidak akan melakukan kejahatan sebelum menjalankannya. Ini bahkan lebih penting ketika Anda menjalankan perintah sebagai pengguna root. Opsi ini dapat diatur dalam file startup .bashrc Anda sehingga diatur kapan pun Anda masuk.

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

421
Sean Bright

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

!text

Ini akan mencari sejarah untuk perintah terbaru 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 ada tindakan sejarah (seperti !!:s/prev_text/after_text), ia menempatkan baris yang dihasilkan ke perintah Prompt. Kemudian Anda dapat meninjau atau mengedit perintah, dan tekan Enter sesudahnya.

36
hayalci

Anda juga bisa:

history | grep "stuff"

itu akan mengembalikan sesuatu seperti

num stuff

maka Anda bisa mengetik

!num
30
Mitch

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

Secara default pada sistem saya, M-p dan M-n mengikat ke fungsi yang sama tapi saya lebih suka mengikat tombol panah:

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

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
13
CurtH

Lelang yang bagus, Sean! Saya sudah memberikan komentar ini, tetapi saya sedikit malu karena reputasi. :-)

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

$ echo nama saya bob 
 nama saya bob 
 $ ^ bob ^ jordan 
 echo 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.

12
Jordan

Karena navigasi melalui histori 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:

enter image description here

5
Martin Dvorak

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.

3
John1024

Jika Shell Anda telah dikonfigurasikan untuk menggunakan vi binding kunci (set -o vi atau memiliki set editing-mode vi di $HOME/.inputrc), maka Anda mencari dengan <Esc>/some-command<Return> dan menekan n (berikutnya) atau Shift-n (sebelumnya) untuk menggilir melalui sejarah baris perintah.

3
Fernando Basso

CTRL+R berfungsi dengan baik, seperti disarankan @ John1024, tetapi agak membosankan jika banyak dari perintah terbaru Anda mirip dan Anda ingin cara cepat untuk memindai semuanya. Alternatifnya adalah menggunakan historyNAME _ :

$ history | grep keyword
2
Mureinik

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

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-cari daftar secara interaktif, atau pindah dengan C-J dan C-K, kemudian jalankan perintah dengan Enter.
  • --height: mengatur jumlah baris yang ditampilkan.
  • --tac: kembalikan daftar (lebih logis untuk riwayat)
  • --tiebreak=index: menjaga urutan sejarah ketika fzf memperbarui hasil
0
Biggybi