Basmadaki ünlem işaretini (!) Anlama


108

kullandım

history | less

önceki komutların satırlarını ve sol taraftaki sayılardan satırları almak için tekrar tekrar istediğim satırı buldum (örn. 22).

!22

komut isteminde ve çalıştı - o zaman yaptığım hatta komutları yürütme. Ünlem işaretinin nerede kullanıldığını, bash tarafından gerçekleştirilen eylemler açısından neyi temsil ettiğini ve nerede kullanacağını çözemiyorum. Dokümantasyondan 'somut' bir açıklama görmüyorum.


6
Bu cevap yardımcı olabilir
Michael Mrozek

9
Sorunuza bir cevap değil, ancak <ctrl> + R, geçmişinizde etkileşimli olarak arama yapmanızı ve aradığınızı bulursanız hemen çalıştırmanızı sağlar.
kasterma

Yanıtlar:


144

!başlangıçta C kabuğunda ortaya çıkmış , ok tuşlarına sahip olacak terminallere güvenmeden önceki günlerde ortaya çıkan bir özellik . Geçerli komut numarasını komut istemine ( PS1="\!$ ") eklerseniz özellikle yararlıdır, böylece geçmiş komutların numaralarını almak için ekranınıza hızlıca bakabilirsiniz.

Artık ok tuşlarını ve Ctrl-Rkomut geçmişini aramak gibi şeyleri kullanabildiğinize göre, bu özelliği pek kullanmıyorum.

Hala yararlı bulabileceğiniz bir başka tür !!ise önceki komutu yeniden uygular. Kendi başıma, !!Enterdaha hızlı bir şey bulamıyorum Enter, ancak daha büyük bir komutla birleştirildiğinde yardımcı olabilir.

Örnek: Tabanlı sistemlerde görülen yaygın bir pilot hata , ekstra ayrıcalıklar gerektiren bir komuttaki ön eki sudounutmaktır sudo. Bir acemi tüm komutu yeniden yazar. Çalışkan öğrenci komutu kabuğun komut geçmişinden düzenler. Aydınlanmış bir tip sudo !!.

Bash !, kabuktaki işlemeyi set +o histexpandveya ile devre dışı bırakmanıza izin verir set +H. Zsh ile ile devre dışı bırakabilirsiniz set -K.


4
Ctrl-P Ctrl-J'yi oldukça hızlı buluyorum; en azından Yukarı Gir'den daha hızlı.
efemient

24
Sadece son komutu çalıştırmak istiyorsanız, Yukarı / Giriş işlemi iyi durumdadır, ancak bir şekilde eklemek istiyorsanız (örneğin, unuttuğunuz sudoveya söylediğiniz bir şey varsa), sudo !!örneğin yapabilirsiniz. Bu, "Up / Ctrl-A (veya yeterince şanslıysanız Ev) / sudo / space / enter" dan biraz daha hızlı olabilir. YMMV. :)

1
@AquariusPower: Sadece alıntı yapın. Ya echo 'Hi!'da echo "Hi!"ya da echo Hi\!. Hepsi aynı şeyi yapar.
Warren Young,

1
setopt NO_BANG_HISTzsh'den daha akılda kalıcı olabilir -K.
gregory

48

Burada daha uzun bir cevap yoksa, son bir kez okuduğumdan beri Süper Kullanıcı'da kesinlikle bir tane var. Gelen bash adam sayfasında size çok büyük bir bölümü başlıklı bulabilirsiniz TARİH EXPANSION konuda.

Tüm ana bilgisayarı yalnızca son komutu çalıştırmaktan veya X komut numarasından daha fazlasını yapabilirsiniz. Başladığınız !catson komutu çalıştırmak gibi şeyler yapabilirsiniz cat. Veya !?bash?:s/bash/csh/içeren son komutu çalıştırır bashancak onunla değiştirir csh.


3
Doğrudan OP'nin sorusuna bir cevap olmasa da, bunun daha da fazla önem kazanması gerekiyor. Çok kullanışlı! Sağol Havok.
malvim

Ah, googlinge başlamadan önce man sayfasına gerçekten bakmalıyım.
erikbwork

1
!!:s/bash/csh/aslında son komutu çalıştırır , daha sonra eğer varsa bash'ı csh ile değiştirir. Bash içeren son komut değil. Olabilir !?bash?:s/bash/csh/ya da belki!?bash?:s/%/csh/
cde

Bash'i birkaç yıl boyunca yoğun bir şekilde kullandıktan sonra, bu anahtar kelime hakkında daha önce hiç bilmediğimi duyduğumda şok oldum ve mansayfaları gezmek için saatler harcadığım halde , bu özellik inanılmaz derecede belirsiz. İlgili bölümü işaretlediğiniz için teşekkür ederiz - bu, asıl dokümanda yeterince açıkladıkları tek yer.
Steve Benner


4

Bir arkadaşım bana e-posta attı:

GNU tarih kütüphanesinin bir parçası. Bash'ta geçmişinizdeki komutları yeniden çalıştırmak için kullanılır. Sert olmak istiyorsanız, uygulama detayları için bash-4.1 / lib / readline / histexpand.c içindeki history_expansion_char komutunu kullanın.


3

Elbette !!bash kabuğundaki son komutu tekrar kullanmak için yapabilirsiniz . Ve sonra !$son emrinin son kısmını tekrar kullanman gerekiyor.

örneğin bir dosyayı görüntüle

less path/to/your/file.txt

Şimdi aynı dosyayı düzenlemek istiyorsanız !$, son komuttan sadece dosya yolunu almak için kullanabilirsiniz .

vim !$

1
Ah, bunu bulmayı umuyordum. İki argümanla nasıl davranır?
Jonathan,

Sadece ikisinin son argümanını tekrar kullanacak. $touch f1 f2ve sonra $vim !$değerlendirecek$vim f2
Teshan Shanuka J
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.