Shell'in geçmişini araştırmanın en iyi yolu


78

Geçmiş dosyamı aramak için grep komutundan daha iyi bir yol var mı? Komutun nasıl başladığı hakkında bir fikrim var, ancak tarihin ne kadar gerisinde olduğunu bilmiyorum.

güncelleme: önceden zsh'e özeldi, ancak çakışan cevaplar nedeniyle, buradaki herhangi bir kabuk (veya mod (vi / emacs)) için cevap vermekten çekinmeyin, sadece özel olup olmadığını not edin.

Yanıtlar:


73

Ctrl+ R, tanımlayıcıda belirtildiği gibi, genellikle en iyi yoldur . Ayrıca kullanabilirsiniz !stringbaşlayarak En son komutu çalıştığı, stringya da !?string?, içeren en son komutu çalıştığı string.

(Bu soruya ilişkin tek şey olduğunu düşünüyorum, ancak bu cevabın içindeki tarih komutlarından daha fazlasını ele aldım )


4
'ctrl + r' nasıl görünmesini sağlarsınız?
xenoterracide

13
@ xen <kbd>Ctrl+R</kbd>. Cevap kaynağı
Michael Mrozek

SE motorunun html teşekkürlerini kabul ettiğini bilmiyordum.
xenoterracide

Kbd anahtar sözcüğünün "ctrl" ve "+" harflerini doğru yorumlayacağını bilmiyordum! Her bir anahtarı ayrı ayrı etiketlerdim. Teşekkürler!
Olivier Dulac

2
@OlivierDulac Ne yazık ki, öyle değil, sadece anahtarları biçimlendirmek için kullandım; Birileri daha sonra ayrı anahtarlar yapmak için cevabımı düzenledi
Michael Mrozek

30

Bash, türünü kullanırken Control- Rve sonra yazmaya başlayın. Yazma Control- Rbazı metinleri girdikten sonra tekrar tekrar, eşleşen komut satırlarında sizi geri götürür.


18

Bunun işe yarayacağından emin değilim, ama kullanmayı severim ctrl- rve sonra komutu yazmaya başlayın. Tarihinizden geçmeli ve size ilk karşılaşmayı sunmalı. Maçlar arasında geçiş yapmak için sadece ctrl- rtekrar basın.


2
Üzgünüm, zsh'yi unuttum. Bu keybinder'i ~ / .zshrc: bindkey '^ R' geçmişinize-artımlı-geriye-aramaya
decriptor

17

Aşağıdakileri eklerseniz ~/.inputrc

"\e[5~": history-search-backward
"\e[6~": history-search-forward

ve kullanmak ardından yazmaya başlayın çıkarabilecekleri gibi Bash yeniden Page Upve Page Downgeri hareket ve sadece yazdığınız aynı öneki ile başlayan çizgilerin tarih boyunca iletmek.

(Bazıları normal ve yerine yeni anahtarlar koymak yerine eylemlerin yerini alacak \e[Ave kullanmayı tercih edebilir .)\e[BUpDown


Bu komutları Alt + Upve ile eşleştirmeyi tercih ederim Alt + Down. Klavye öykünmesi bağlı terminali taklit bu kombinasyonların ya eşleştirilmiş olabilir kullanır \E[Ave \E[A(Linux Anahtar Bağlar ile örneğin KDE Konsole'da) ya da \E[1;3Ave \E[1;3B(X Ücretsiz 4 Bağlar ile örneğin XFCE Terminali veya KDE konsol).
Christian Herenz,

9

Ctrl- Rtarafından zaten çağrılan etkileşimli bilgi istemi en uygun yoldur. Ek olarak, şu anda komut satırında bulunan bir ön ekin geçmişini aramak için yeniden eşleme Upve Downok tuşlarıyla popülerdir , ancak bu dosyada bazı değişiklikler~/.inputrc gerektirir .

Klasik ve daha az etkileşimli çözüm, kabuk tarihçesi genişlemesini kullanmaktır. Yazıyor

!foo

foove ile başlayan son komutu çalıştıracak

!?foo

içeren son komutu çalıştıracak foo. Geçmişi genişletme hakkında daha fazla bilgi , kabuğunuzun Bash veya uyumlu olduğu varsayılarak Bash referans kılavuzunda bulunabilir .


6

Eğer eklerseniz stty -ixonsizin için ~/.bashrcdosyaya daha sonra Ctrl- sters yöne gidecek Ctrl- r.


C-sBu amaçla kullanmak istedim , ancak terminalim dondu ; dikkat! (Eh, henüz işe stty ixon
yaramadı

3
@ imz: C-q" çözülecek ". Bu ve C-syavaş seri bağlantıları kullanıldı manuel (ara) çıkış akışını kesmek için bir kez faydalıydı zamanki yazılım akış kontrolü karakterlerdir. Şimdi çıktılar o kadar hızlıdır ki çoğu durumda, bastığınızda ne görmek istediğinizi C-sönceden kaydırmak istediğiniz şeyi görmek istersiniz . stty -ixonyazılım akış kontrolünü kapatır.
Dennis Williamson,

Fantastik! Yıllarca böyle bir tarihe ilerlemenin bir yolunu aradım.
marlar

3

Eğer yazarsanız, !lsbash geçmişinize bakacak ve "ls" ile başlayan en son komutu uygulayacaktır.


2

zsh spesifik olabilir. Araştırırken bu cevabı ben buldum vi-history-search-backward biri ile arama yapmanızı sağlar /(ı idi söz etmedi) vi modunda daha sonra kullanabilirsiniz nve N(bastıktan sonra sırasıyla ileri ve geri arama enter).


2

Bunun söylenmediğine şaşırdım - ancak bunu yaparak bash veya ksh'da vi-mode seçebilirsiniz:

set -o vi

... veya bunu içeriği olarak kullanmak ~/.inputrc(bash gibi programlarda kullanılan GNU okuma hattı için):

set editing-mode vi

Ondan sonra komut modunaEsc girmek ve tarihe geri dönmek ve ileri gitmek için kullanabilirsiniz. Normalde aramak ve tersten aramak için kullanarak da arama yapabilirsiniz .kj/?

Eğer kullanırsanız ~/.inputrc, o zaman bu sadece GNU bash ancak böyle MySQL komut kabuğu gibi CLISP ve muhtemelen programları gibi ve CPAN kabuğu gibi GNU readline kullanan hiçbir şeye değil çalışacaktır.


2

Geriye doğru aramayı kullanırken ileriye gitmek için (Ctrl-R komutuyla):

  1. .Bashrc dosyanızı açın:
    sudo gedit ~/.bashrc

  2. bu satırı ekleyin ("f" harfi henüz sistem tarafından kullanılmayan bir başkasıyla değiştirilebilir)

    bind '"\C-f": forward-search-history' 
  3. Dosyanızı kapatın ve .bashrc dosyanızı güncelleyin (veya başka bir terminal açın) şu komutla:
    source ~/.bashrcveya. ~/.bashrc

ŞİMDİ KISA İLE TARİHTE İLERİ TAŞIYOR: Ctrl + f

Ubuntu Çalışması 18.04 LTS


1

Çoğu zaman iki iz takip ediyorum.
Ancak ikisinin de karakterleri başlatmak için arama yaptıklarını unutmayın.

  1. tcsh : komutun bazı birkaç karakterini yazın, sonra Esc+ pbu tuş sırasından başlayarak önceki komutu gösterecektir, bir daha basınca başka bir komut gösterecektir.
  2. ksh : bunu kullan fc -e - <SPACE> <first few char for your previous >, o sırayla eşleşen son komutu çalıştıracak.

Ksh ve tcsh'm için Bash'de Ctrl+ gibi bir şey bulamadım R.


3
Ctrl + r, ksh ile Bash'den biraz farklı çalışır. Ctrl + r tuşlarına basın, ardından aradığınız dizeyi yazıp enter tuşuna basın . Aynı şeyi aramak için, Ctrl + r tuşlarına basın ve dizeyi yeniden yazmak zorunda kalmadan girin. Bu arada, bu set -o emacsmodda.
Dennis Williamson

@Dennis: +1 :-)
Hemant

1

Kullanmak için bir yol yoktur Ctrl- Rile tcsh . Şunlara aşağıdakileri ekleyin ~/.cshrc:

bindkey "^r" i-search-back (sadece bir şapka işareti ve r harfidir)

Bu benim için en büyük zaman tasarrufu.


1

@ephemient benzer bir cevap, ancak .bashrc içine koyabilirsiniz

bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-foward'

ve ifadenin bir kısmını yazın ve ardından eşleşen en yeni seçeneklere göz atmak için yukarı / aşağı oklarını kullanın. Bu matlab'ın varsayılan davranışı.

Eğer bağlantı noktasına yeni bir sisteme Ayarlarınızı isterseniz en millet için, sadece senin dolanabilir hatırlamak daha kolaydır ~/.bashrco zaman var o dolanabilir o~/.inputrc


0

Evet, en azından zsh kullanıyorsanız vardır. Sadece komutu yazmaya başlayın ve ardından M-p( ESC p) tuşuna basın ; yazdığınızla eşleşen önceki komutları bulur. Bir sonraki eşleşmeyi bulmak için tekrar basın.


Bu cevap daha fazla açıklama ile yapabilir.
phunehehe
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.