Az önce yazdığım önek ile önceki bir komutu arayın


67

Komut geçmişinde gezinmek için yukarı ve aşağı okları kullanabiliriz.

Matlab gibi bazı IDE'lerde, eğer bir şey girersek ve sonra ok tuşlarına basarsak, girdiklerimizle başlayan sadece tarih komutları arasında dolaşırız. Bu gerçekten uygun, ancak bir kabuk terminalinde bu işe yaramıyor.

Bir kabuk terminalinde benzer bir fonksiyon kazanmanın bir yolu var mı? Ve terminal kullanımında verimliliği artırmak için başka ipuçları?


fish;) Gibi bir özellik sağlayan bir kabuk kullanabilirsiniz ;
yoann

@yoann bash'ın olmadığını varsayıyor. Readline yoluyla, varsayılan olarak erişilebilir değil.
muru

@muru bash'de CTRL + R'nin farkındayım ve egmont'un cevabı Page Up / Page Down ile yapmanın güzel bir yolunu sunuyor. Ancak ok tuşları ile bunu yapmanın bir yolu var mı?
yoann

1
@yoann kontrol unix.stackexchange.com/a/76591/70524 . Bunun yerine \e[5~ve \e[6~kullanımı \e[A, \e[B.
muru

Yanıtlar:


95

Aradığın şey CtrlR.

Yazıp CtrlRistediğiniz komutun bir kısmını yazın. Bash ilk eşleştirme komutunu gösterecektir. Yazmaya devam edin CtrlR, bash önceki eşleşen komutlar arasında geçiş yapacaktır.

Geçmişi geriye doğru aramak için, CtrlSbunun yerine yazın. ( CtrlSSizin için bu şekilde çalışmazsa, bu muhtemelen XON / XOFF akış kontrolünü devre dışı bırakmanız gerektiği anlamına gelir: bunu yapmak için çalıştırın stty -ixon.)

Bu, "Arama" altında belgelenmiştir man bash.


1
Ctrl-Qdonma durumundan çıkmak için, önce Ctrl-Sakış kontrolünü kapatmadan vurduysanız ve terminalinizi donmuş halde tuttuysanız.
HongboZhu

26

Bunları içine yerleştirin ~/.inputrc:

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

Bunlar istediğin gibi yapar Page Upve Page Downdavranır. (Bazı dağıtımlar bunu sizin için zaten yapılandırdı.) Kişisel olarak bu yolları Ctrl+ Rveya ' dan daha uygun buluyorum history.


Bu, tüm güncel cevaplarda en uygun yoldur. Çalışma mekanizması hakkında biraz açıklama yapabilir misiniz?
Lee,

3
~/.inputrcya /etc/inputrcda ortam değişkeni tarafından başvurulan $INPUTRCdosya, bash (kabuğunuz) dahil, readline kullanan tüm uygulamanın satır düzenleme yapılandırma dosyasıdır. Bu ikisi de dahil olmak üzere bazı yerleşik çizgi düzenleme yeteneklerine sahiptir: bash kılavuz sayfasında daha fazla bilgi edinmek için bu anahtar kelimelerden birini arayın. \e[5~/ \e[6~Page Up terminal emülatörlerine çoğunda / Aşağı tuşları tarafından oluşturulan kaçış dizileri şunlardır; Bunu görmek için, catkomutu başlatın ve sonra bu tuşlara basın (kaçış baytı terminalde, as ^[ile giriş olarak gösterilir \e).
egmont

Asıl sorunuzdaki örnek, Yukarı / Aşağı tuşlarının Matlab'da bu şekilde çalıştığını söylüyor. İnputrc'de Yukarı ve Aşağı sırasını yerleştirip bu eyleme atadıysanız, ne olduğunu görmek ilginç olurdu; düzgün çalışır mı yoksa varsayılan davranışlarıyla çakışırsa kötü yan etkileri olur mu? Bilmiyorum, bununla deney yaparsanız bulgularınızı duymaktan mutluluk duyarım.
egmont

Yaptığım zaman echo $INPUTRCboş. Ubuntu
14.04

2
Ben şahsen bunu yapmak için yukarı ve aşağı ok "\e[A": history-search-backward"\e[B": history-search-forward
basmayı

9

Ayrıca ^ r / ^ s geçmişi i-search:

alt.imlecindeki önceki komutun son "kelimesini" ekler. Eski komutlardan son sözü almak için tekrarlayın. (Ancak bir arka &plan komutları için bir sonun önemli olduğunu unutmayın .)

Bu süper kullanışlı mkdir foo, cdalt-nokta. Yukarı-oktan daha hızlı, ^ a, alt-d (ileri sözcüğü sil) cd.

En son 2. kelimeyi almak için kullanın esc - 2 alt+.(örn. Emacs tarzı sayısal bir argüman kullanın alt+.. Sonundan itibaren negatif sayım, olumlu başlangıçtan ileri sayılır). Bir noktada, fareye ulaşmak ve kopyala / yapıştır veya yukarı ok ve bunun bir kısmı ^ w / ^ y'ye ulaşmak daha hızlıdır (aşağıya bakın).


Terminaliniz güzel / doğru bir şekilde kurulursa, ctrl-left ve ctrl-right kelimelerle ileri / geri gider. Olmazsa, umarım en azından alt-b ve alt-f aynı şeyi yapar.


ctrl- / bir geri alma işlemidir. Biraz tekrar atladığınızda geri almanız durumunda, kelimeleri daha verimli bir şekilde silmek için otomatik tekrar özelliğini kullanabilirsiniz.


Komutların daha güçlü bir şekilde karıştırılması / eşleştirilmesi Emacs'taki gibi çalışan öldürme halkasını kullanmaktan gelir. Son ctrl-w / ctrl-u / ctrl-geri al / alt-d yapıştırmak için ctrl-y. daha eski öldürülen metinler arasında dolaşmak için alt-y tuşlarına basın.

Çoklu ctrl-w veya üst üste ne olursa olsun kill-ring girişini yapar. İki şeyi kaldırmak ve yalnızca birini yapıştırmak istiyorsanız, girişi bölmek için sol ve sağ okları veya bir şey kullanın.

Bunları bir araya getirerek,

  • komut yazmaya başla
  • ctrl-r ile eski bir komuta geri dönebilir ve bir kısmını control-w ya da benzeri bir komutla çekebilirsiniz.
  • esc-r veya bir alt+rkısmını silmeden önceki haline geri yüklemek için.
  • alt- >tarihin sonuna gitmek için (yani aşağı ok tüm yol) geri ortasında olduğumuzu komuta olsun.

Diğer etkileşimli kullanım ipuçları:

Etkinleştir shopt -s globstar, böylece yapabilirsin **/*.c(geçerli dizin dahil özyinelemeli). Bazen etkileşimli kullanım için kullanışlıdır, ancak genellikle find -name '*.c' -exec foo {} +daha iyidir.

Bash scriptleri yazarsanız shopt -s extglob, etkileşimli mermilerinizde de etkinleştirmeyi kullanışlı bulacaksınız . Sen olacak bazen gibi şeyler için bir kullanım alanı bulmaktadır *.!(c|h).c veya .h ile sona olmayan dosyaları eşleşecek.

Eğer için mi adlar bulun ls -l, lessbaşka ve bir şey bir sürü yapmak. ( cp -i, mv -ive güzeller. Seçici bir rm yapmalarına bağlırm -I olma alışkanlığına kapılmayın. GNU rm's -Ben tüm argümanları bir kez sorarım.)

Seviyorum alias m=less("daha fazlası için m"). Ben var lessolan kurmak ,ve .bir sonraki / önceki dosyaya bağlı ( lesskey). Varsayılan ayar, otomatik tekrarlama ile kullanılamayan bir çoklu tuş basma dizisidir.


GNU ekranındaki her şeyi yapmayı seviyorum. Numaralandırılmış ekran pencerelerini takip etmeyi Konsole'deki (ya da denediğim diğer herhangi bir terminal emülatöründeki) sekmelerden daha kolay buluyorum. Zaten bilmiyorsanız screen, tmux'u öğrenin çünkü daha yeni ve daha az güvenilir.

Başka bir kabukla aynı cwd ile yeni bir kabuk açma işlevi gibi bir şey elde etmek için , ekran penceremdeki 8 kabuğumun hangi dirseğinicds 8 kullanacağımı seçmem için cd / pushd / popd için özel bir kanca kullanıyorum. Bu, yalnızca bir ekran oturumu olduğu sürece ekran oturumu dışındaki kabukları için bile çalışır.


Benimki "uygun şekilde yapılandırılmış" görünmüyor. Burada gördüğüm birçok kısayol çalışmıyor, Ubuntu 14.04'ten Stok Terminal kullanıyorum. Nasıl yapılandırabilirim?
JorgeeFG

@JorgeeFG: KDE'ye gnome-terminalgeçmeden önce Ubuntu 14.04'teki kutusundan çıkardığımı düşünüyorum . İlgili seçenek, terminal ayarlarınızda, esc-prefix vs high-bit ve belki bazı diğer ayarlardır. Bazıları benim için ssh ile mükemmel çalışmıyor. (örn. ctrl sola / sağa ok tuşunun kaçış kodunu doldurun ve 5Dkelimenin tam anlamıyla ortaya çıkıyorum )
Peter Cordes

7

Aşağıdaki satırları telefonunuza ekleyin. ~/.inputrc

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

Bu, egmont'un cevabına benzer, ancak Sayfa Yukarı ve Sayfa Aşağı kullanmak yerine, Yukarı Ok ve Aşağı Ok için kaçış dizilerini kullanır. Bu şekilde, Mac'te kullanmak çok daha uygundur.


4

Makinelerimi her zaman büyük bir HISTSIZE değeri ile yapılandırma eğilimindeyim, bu yüzden daha uzun bir geçmiş listesi ve HISTTIMEFORMAT zaman damgası değeriyle tutar, böylece komutun ne zaman çalıştığını görebilirim.

export HISTSIZE=10000
export HISTTIMEFORMAT="%m/%d/%Y %T "

3

Genellikle kullandığım araçlar, historykomutu birleştirmekgrep

IE:

history | grep <command im looking for>

Bu, o komutu içeren, yazdığınız numaralandırılmış komutların geçmişini görüntüler, sonra kullanabilirsiniz:

!<number listed in history command>

bu komutu tekrarlamak için.

IE:

history | grep history

142  history
143  history | grep lvresize
568  history | grep echo
570  history | grep echo
571  history | grep history

bunu takiben: !571

tekrar edecek history | grep history


1
CR = çok daha iyi + çok daha güvenli
PSkocik

1
Belki de Şahsen ben çoğu komutu bulmak için daha hızlı bir araç olmak üzere sıyrılmak için oluşturulmuş bir tarih buluyorum. Daha Güvenli olduğu sürece, ne demek istediğinizi tam olarak anlamadım, geçmişi kullanarak cR ile arama yapmanın getirdiği riskler nelerdir?
Gravy

2
@Gravy PSkocik'in !tarih değişikliğinin daha az güvenli olduğu anlamına geliyor
derobert 23:15

3
@Gravyet İçsel riskler yanlışlıkla yanlış sıraya giriyor olacaktı. Control-S kullanmıyorsanız ve xon / xoff akış kontrolünü etkinleştirmediyseniz (genellikle varsayılan) terminalinizin neden donmuş olduğu hakkında hiçbir fikrim yok. Eğer öyleyse, Control-Q geri getirecek.
derobert

1
@PSkocik ile aynı fikirdeyim, cr daha iyidir çünkü tarih satırını tekrar düzenlemek, aynı şekilde yapmaktan daha kolaydır. Aynı komutun tekrar çalıştırılması, karmaşık tek gömleklerde varyasyonları yeniden yazarak zamandan tasarruf etmek veya uzun bir yoldaki farklı bir dosyayı sekmeden tamamlamak için yapabileceğiniz önemsiz bir durumdur. Cevabımı gör.
Peter Cordes

1

Bash terminalimde günlük 4 ipucu (ve diğerleri) kullandım :

  • Son komutu çalıştır: !!

  • Tarihten N komutunu yürütün : !N

  • Tarihin ön ekiyle başlayan son komutu yazdır : !prefix:p

  • Tarihin öneki ile başlayan son komutu yürütün : !prefix


1

Cona zshyerine kullanmak bashsenin için uygunsa, bunun için oh-my-zsh kullanın .

Komut geçmişinizde yukarı aşağı gezinme işlemini içerir. Ayrıca, daha önce metin yazdığınızda (Mathlab gibi) aynı gezinmeye izin verir.

düzenleme: Ayrıca takma adlar ve temalar gibi geliştirici odaklı diğer öğeleri de içerir. Bu ekstralar dağıtımı daha büyük ve kullanımı daha karmaşık hale getirir.

https://github.com/robbyrussell/oh-my-zsh


1
oh-my-zshtonlarca malzeme içerir. Şunu söyleyebilirsiniz: Bu tam özellik, ihtiyaç duyduğunuz tek şey belirli bir ayar veya uygulama olduğunda bu dağıtımda bulunur.
muru

Gönderiyi düzenledim: Basit bir uygulamadan daha büyük olduğu konusunda uyarmıştım.
user9869932

1

~ / .Bashrc dosyasına şu diğer adı ekleyin

alias h='history | awk '"'"'{$1="";print}'"'"' |sed "s/^ *//" |grep -v "^h " | sort | uniq | grep'

Kullanımı: h fireBana ateş içeren komutların bir listesini getirecek . ya h ^fireda bana ateşle başlayan bir komut listesi getirecek .

Aynı anda bir dizi komutu görüntülemek istediğimde bu kullanışlıdır.

Bu arada, '"'"'çirkin ancak tek tırnak içinde tek tırnak önlemek için başka yollar bulamadım.


Bilginize - h="history | awk '{\$1=\"\"; print}'çalışması gerekir. alternatif olarak bir işlev oluşturun ve onu çağırın.
DarkHeart

teşekkür ederim DarkHeart, ama kodunu denedim, çevremde çalışmadı, belki benimkinde farklı bir şey var
Hosi Golden
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.