Memahami tanda seru (!) Di bash

108

Saya menggunakan

history | less

untuk mendapatkan baris-baris perintah sebelumnya dan dari angka-angka di sebelah kiri saya menemukan baris yang saya ingin ulangi (mis. 22) dan melakukan

!22

pada prompt perintah dan itu berhasil - mengeksekusi set perintah pada baris yang saya lakukan pada waktu itu. Saya tidak tahu di mana tanda seru digunakan, apa yang diwakilinya dalam hal tindakan yang diambil oleh bash, dan di mana menggunakannya. Dari dokumentasi saya tidak melihat penjelasan yang 'nyata'.

Vass
sumber
6
Jawaban ini mungkin membantu
Michael Mrozek
9
Bukan jawaban untuk pertanyaan Anda, tetapi <ctrl> + R akan memungkinkan Anda untuk mencari riwayat Anda secara interaktif dan kemudian langsung mengeksekusi jika Anda menemukan apa yang Anda cari.
kasterma

Jawaban:

144

!adalah fitur yang awalnya muncul di shell C , kembali pada hari-hari sebelum Anda dapat mengandalkan terminal untuk memiliki tombol panah. Ini sangat berguna jika Anda menambahkan nomor perintah saat ini ke prompt ( PS1="\!$ ") sehingga Anda dapat dengan cepat melihat layar Anda untuk mendapatkan nomor untuk perintah sebelumnya.

Sekarang Anda dapat menggunakan tombol panah dan hal-hal seperti Ctrl-Runtuk mencari sejarah perintah, saya tidak melihat banyak kegunaan untuk fitur ini.

Satu varian dari itu Anda mungkin masih menemukan berguna adalah !!, yang menjalankan kembali perintah sebelumnya. Sendiri, saya tidak menemukan yang !!Enterlebih cepat dari sekadar Enter, tetapi dapat membantu ketika digabungkan menjadi perintah yang lebih besar.

Contoh: Kesalahan pilot umum pada sudosistem berbasis adalah untuk melupakan sudoawalan pada perintah yang membutuhkan hak istimewa ekstra. Seorang pemula mengetik ulang seluruh perintah. Siswa yang rajin mengedit perintah dari sejarah perintah shell. Yang tercerahkan adalah tipe sudo !!.

Bash memungkinkan Anda menonaktifkan !pemrosesan di shell dengan set +o histexpandatau set +H. Anda dapat menonaktifkannya di Zsh dengan set -K.

Warren Young
sumber
4
Saya menemukan Ctrl-P Ctrl-J cukup cepat; lebih cepat dari Up Enter, setidaknya.
ephemient
24
Jika Anda hanya ingin menjalankan perintah terakhir, Atas / Masuk baik-baik saja, tetapi jika Anda ingin menambahkannya dengan beberapa cara (misalnya, Anda lupa sudo, atau sesuatu), maka Anda dapat melakukannya sudo !!, misalnya. Itu mungkin sedikit lebih cepat daripada "Atas / Ctrl-A (atau Rumah, jika Anda cukup beruntung) / sudo / space / enter". YMMV. :)
1
@AquariusPower: Kutip saja. Entah echo 'Hi!'atau echo "Hi!"atau echo Hi\!. Semua melakukan hal yang sama.
Warren Young
1
setopt NO_BANG_HISTdi zsh mungkin lebih mudah diingat daripada -K.
gregory
48

Jika tidak ada jawaban yang lebih panjang di sini pasti ada satu di Super User, karena saya sudah membaca satu baru-baru ini. Di halaman bash man, Anda dapat menemukan bagian besar berjudul SEJARAH EKSPANSI tentang masalah ini.

Anda dapat melakukan seluruh host lebih dari sekedar menjalankan perintah terakhir, atau perintah nomor X. Anda dapat melakukan hal-hal seperti !catmenjalankan perintah terakhir yang dimulai dengan cat. Atau !?bash?:s/bash/csh/jalankan perintah terakhir yang berisi bashtetapi ganti dengan csh.

Cry Havok
sumber
3
Meskipun tidak secara langsung menjawab pertanyaan OP, ini membutuhkan lebih banyak upvote. Sangat berguna! Terima kasih, Havok.
Malvim
Eh, saya harus benar-benar melihat ke halaman manual sebelum saya mulai googling.
erikbwork
1
!!:s/bash/csh/sebenarnya menjalankan perintah terakhir , lalu mengganti bash dengan csh, jika ada. Bukan perintah terakhir yang menyertakan bash. Itu akan !?bash?:s/bash/csh/atau mungkin!?bash?:s/%/csh/
cde
Setelah menggunakan Bash secara ekstensif selama beberapa tahun, saya terkejut menemukan bahwa saya belum pernah tahu tentang kata kunci ini sebelumnya, dan meskipun saya telah menghabiskan berjam-jam meneliti manhalaman, fitur ini sangat tidak jelas. Terima kasih telah menunjukkan bagian yang relevan - itulah satu-satunya tempat di dokumen yang sebenarnya di mana mereka menjelaskannya dengan cukup.
Steve Benner
39

Banyak lagi yang bisa dilakukan dengan !:

  • jalankan perintah yang diketik sebelum 3 perintah: !-3
  • jalankan perintah yang dimulai dengan !ls

dan masih banyak lagi. Lihat 15 Contoh Ekspansi Sejarah Bash Linux yang Harus Anda Ketahui

pengguna379997
sumber
Terpilih ini. Tidak ada jawaban lain yang punya trik pintar ini.
Gergely Lukacsy
Terpilih karena www.thegeekstuff.com hanyalah sumber yang fantastis, dan ini adalah salah satu dari sedikit artikel linux yang belum pernah saya lihat sebelumnya. Sangat membantu.
Steve Benner
4

Seorang teman saya mengirimi saya email ini:

Itu bagian dari perpustakaan sejarah GNU. Dalam bash itu digunakan untuk menjalankan kembali perintah dalam riwayat Anda. Jika Anda ingin menjadi hardcore, coba sejarah_expansion_char di bash-4.1 / lib / readline / histexpand.c untuk detail implementasi.

Vass
sumber
3

Tentu saja dapat Anda lakukan !!untuk menggunakan kembali perintah terakhir di bash shell. Dan kemudian ada !$untuk menggunakan kembali bagian terakhir dari perintah terakhir Anda.

misalnya melihat beberapa file

less path/to/your/file.txt

Jika sekarang Anda ingin mengedit file yang sama, Anda bisa menggunakan !$untuk mendapatkan hanya path file dari perintah terakhir

vim !$
Teshan Shanuka J
sumber
1
Ah, aku berharap menemukan ini. Bagaimana perilakunya dengan dua argumen?
Jonathan
Itu hanya akan menggunakan kembali argumen terakhir keduanya. $touch f1 f2dan kemudian $vim !$akan mengevaluasi untuk$vim f2
Teshan Shanuka J