Bash geçmişi arama, kısmi + yukarı ok


146

Aradım, ancak bu konuda hiçbir şey bulamadım. Bir terminal kullanarak bash'ta bir işlevsellik arıyorum.

Bir zamanlar debian sistemde bir kullanıcım vardı ve bir arkadaşım bana daha önceki bir komutun başlangıcını yazacağım uygun bir tarih arama özelliği (daha sonra tcsh kullandım sanırım) ayarlamıştı. ve kısmi dize dayalı bir arama yapar.

Örneğin eğer geçmişim:

./script.pl
./script.pl arg1
cat output
cat output | grep yada

Ve yazın .ve basın yukarı ok, beni gösterecektir: ./script.pl arg1. Tekrar basın, gösterecektir ./script.pl, vs.

Bir çok grep.bash_history'de gerçekleştireceği gibi . Bu işlevselliği elde etmenin bir yolu var mı?



1
@Marcel Aynı cevap gibi görünüyor, aramada bunu gördüm, ancak sorumu iPython ve Shell anahtar kelimelerle bağlamadım.
TLP

Yanıtlar:


197

Aşağıdaki satırları içine koyun ~/.inputrc:

## arrow up
"\e[A":history-search-backward
## arrow down
"\e[B":history-search-forward

İle başlayan satırlar yorumdur #. Geriye dönük olanı ve ileriye dönük olanı hatırlayamıyorum. Deneyin. Belki geriye ve ileriye gitmelisin.


Biraz arkaplan bilgisi:

Bash, istemi ele almak için readline kullanıyor . ~/.inputrcreadline için yapılandırma dosyası. Bunun, readline kütüphanesini kullanan diğer yazılımlarda da etkili olacağını unutmayın, örneğin IPython .

Readline hakkında daha fazla bilgi için bash kılavuzunu okuyun . Orada ayrıca okuma ile ilgili daha fazla okuma satırı komutları bulabilirsiniz .

Ok tuşlarının çıkış kodlarını almak için aşağıdakileri yapabilirsiniz:

  1. catBir terminalde başla (sadece cat, başka tartışma yok).
  2. Klavyede tuşları yazın, ^[[Ayukarı ok ve ^[[Başağı ok gibi şeyler alırsınız .
  3. Değiştir ^[ile \e.

1
Harika, ancak bu çözüm ctrl-left / ctrl-right kısayollarını devre dışı bırakır.
Eyal

Herkes ben marka için aynı elde edebilirsiniz nasıl açıklayacaksınız
Hitesh Kumar

@lesmana, yalnız kedi kısmı için ekstra puan vereceğim
Mike D

İkincil @Eyal, herkesin buna nasıl sahip olabileceğim konusunda tavsiyesi var, ancak ctrl-left / ctrl-right kısayollarını koruyabiliyor mu?
kbrose

6
Tüm varsayılanları korumak için $include /etc/inputrc, tercihen ilk satıra ekleyin .
Tulio Casagrande

31

Aşağıdaki içerikle birlikte /etc/profile.d/ içinde 644 kipiyle setup_readline.sh isimli bir dosya oluşturun, giriş yapın ve tercih ettiğiniz anahtarları kontrol edin:

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

Bunu yapmanın en iyi yolu olduğunu düşünüyorum. Çoğunlukla şef, kukla, vb. Gibi yapılandırma yönetim sistemlerini kullanıyorsanız

Ve sistem yapılandırma hala dokunulmaz!


4
İşin garibi ~ / inputrc benim için işe yaramadı - ama bu komutları .bash_profile 'in içine koydum.
Joe,

1
.inputrc ana klasörümde yok ve bu tür ayarların .bashrc'de olmasını tercih ediyorum, böylece ayarlarım için sadece bir dosyayı taşıyabiliyorum. Yani bu muhtemelen daha sonra kabul edilen bir cevaptır.
Shital Shah

.inputrc benim için harika çalışıyor, ancak yükledikten sonra değil screen. İşin garibi, diğer .inputrc kısayolları işe yarıyor ama bunlar değil Bu yüzden şimdi iki çözümü de kullanıyorum.
Orwellophile

Bu, örneğin, bir şeyleri yapmak için bir sunucuya giriş yaptığınızda ve bunlardan hiçbirini kaybetmediğiniz ve sunucudaki ~ / .inputrc dosyasını düzenlemek ve yeniden yüklemek istemediğinizde süper yararlıdır.
danmactough

13

Ctrl + R size bu tür bir işlevsellik verecektir. Kısmi bir komut yazmaya başladığınızda, yukarı ve aşağı oklarla gezinebileceğiniz eski komutlarla gelir. Daha fazla bilgi: http://www.nuxified.org/blog/ctrl_r_in_the_bash_shell


2
Cevabın için teşekkürler. Evet, denedim ama biraz ... titiz buldum. Kısmi ile başlayan komutları kaydırmama izin vermiyor, sadece birincisini gösteriyor. Aynı zamanda karakterin tüm komutunu arar, ki bu bir tür yararsızdır.
TLP

5
@TLP, vurmayı tekrarlamaCtrl+r
akostadinov

4

Lesmana'nın 14.04 numaralı Güvenim kapsamında oluşturmam gereken "~ / .inputrc" cevabını tamamlamak için, "~ / .bashrc" içinde doğrulayın / ekleyin (ilk satır "~ / .bashrc" adresimde zaten var):

shopt -s histappend  
PROMPT_COMMAND='history -a'  

Fransızca zaten https://doc.ubuntu-fr.org/terminal?&#pour_completer_les_commandes_a_partir_de_l_historique .


2
Bu komut temel olarak bash'a oturumun bitmesini beklemek yerine derhal geçmişi dosyaya komut eklemesi talimatını verir. Açık terminaller çok açıksa ve bir tanesinde geçmişi kaybetmek istemiyorsanız, ancak gerekli değilse, kullanışlıdır. digitalocean.com/community/tutorials/…
Shital Shah

3

Belki de bir ölçütlere dayanarak (ne zaman, ne sıklıkta ve komutların uzunluğunun önemli olduğu) Bash tarihinin basit ve çok satırlı basit filtrelemesini sağlayan https://github.com/dvorka/hstr adresini denemek isteyebilirsiniz - Kolayca gezinmek için ok tuşları:

görüntü tanımını buraya girin

Kolayca edilebilir bağlı için Ctrl-rve / veyaCtrl-s


0

Aşağıdaki çözüm, yukarıda belirtilen yaklaşımlardan bazılarını birleştirir ve genişletir: Aşağıdaki davranışa ulaşmak için ~/.bash_aliasesdosyanıza aşağıdaki satırları ekleyin (gerek yok ~/.inputrc):

  1. CTRL + UP ve CTRL + DOWN tuşlarına basarak tarihte yukarı / aşağı (yalnızca aynı öneki girişler) hareket ettirin. Bu, yalnızca YUKARI ve AŞAĞI ile tüm tarih boyunca yukarı / aşağı hareket etmenin standart işlevselliği ile birlikte olabilir
  2. CTRL + RIGHT ve CTRL + LEFT tuşlarına basarak komut satırında sonraki / önceki kelimeye atlayın
bind '"\e[1;5A":history-search-backward'
bind '"\e[1;5B":history-search-forward'
bind '"\e[1;5C":forward-word'
bind '"\e[1;5D":backward-word'

source ./bash_aliasesDeğişiklikleri uygulamak için kabuğa tekrar giriş yapın (veya çalıştırın ).

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.