Bisakah saya mencari riwayat di bash dan menjalankan hasilnya?
Bisakah saya mencari riwayat di bash dan menjalankan hasilnya?
Jawaban:
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 bash
halaman manual .
Bash memiliki banyak fasilitas untuk mencari dan mengakses riwayat perintah interaktif. Yang paling mendasar adalah history
builtin. 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 clear
perintah. Builtin sejarah memiliki banyak fitur sendiri, Anda dapat melihat lebih dalam bash
dan history
manusia halaman.
Anda juga dapat menentukan offset negatif relatif saat menggunakan !
penunjuk, jadi menggunakan daftar riwayat kami di atas, jika kami ingin mengeksekusi vim
lagi, 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 bash
untuk 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 clear
lagi, yang perlu kami lakukan adalah mengetik:
$! cl
dan tekan Enter. Dan bagaimana vim
? Itu sesederhana:
$!? beberapa
Poin terpenting dari respons hayalci adalah panggilan ke shopt
builtin:
$ 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 .bashrc
file startup 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 .
shopt
berjalan di bashrc, bukan bash_profile (atau tidak akan diaktifkan untuk shell yang bukan shell login).
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.
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'
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
HISTIGNORE
.
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.
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:
ctrl + r
secara default sekarang
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.
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 tekan n
(berikutnya) atau Shift-n
(sebelumnya) untuk menelusuri sejarah baris perintah.
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 sejarahnyased
: hapus kolom nomor dari daftar (POSIX)fzf
: di sini adalah keajaiban, memungkinkan Anda untuk mencari fuzzy daftar secara interaktif, atau bergerak dengan C-J
dan 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