Bash tarihini nasıl arayabilirim ve bir komutu nasıl yeniden çalıştırabilirim?


Yanıtlar:


428

Tip Ctrl Rkomut satırına ve önceki komutunu yazmaya başlayın. Bir sonuç göründüğünde Ctrl Rdiğer eşleşmeleri görmek için vurmaya devam edin . İstediğiniz komut görüntülendiğinde, tuşuna basın.Enter

Bu süre Not Ctrl REğer (komutu isteseydi, varsayılan reverse-search-history) bağlı olan Ctrl Taşağıdaki o yapılandırabilirsiniz size:

'"\ Ct" kelimesini bağla: ters arama geçmişi

Sizin için de mevcut olan diğer bir salt okunur ikili komutları vardır. bashAdam sayfasına bir bak .

Bash'in etkileşimli komut geçmişini aramak ve erişmek için birçok özelliği var. Bunların en temel olanı historyyerleşiktir. Sadece yazarak:

$ geçmiş

Sayısal bir dizinin yanı sıra aşağıdaki gibi bir komut listesi yazdıracaktır:

$ geçmiş
1 temizle
2 l -
3 vim ~ / somefile.txt
4 geçmiş
$

Daha sonra !, Mitch'in belirttiği gibi , dizini tekli seçerek sayısal dizinlerini kullanarak bu komutlardan herhangi birini çalıştırabilirsiniz :

$ 1

clearKomutu yürütecek . Tarihin yerleşik bir çok özelliği vardır, bashve historyman sayfalarında daha fazlasını görebilirsiniz .

Göstergeyi kullanırken göreceli negatif sapmaları da belirtebilirsiniz !, bu nedenle yukarıdaki tarih listemizi kullanarak, vimtekrar yürütmek istiyorsak , şunları yapabiliriz:

$! -2

Temelde bash'a “iki komut önce koştuğunuz” komutu çalıştırmasını söylüyor. Geçmiş listesinde önceki komutu çalıştırmak için sadece kullanabiliriz !!(ki bu sadece kısa yol için !-1).

!Designator Çalıştırmak hangi komutu sayısal belirten etmek sınırlamaz. hayalci , bashbaşladığı metne (kullanma !) veya komutun içindeki (kullanma ) metne dayalı bir komut çalıştırma talimatı verebileceğinizi gösterdi !?. Yine yukarıdaki örnek tarihçe listemizi kullanarak, cleartekrar yürütmek istiyorsak tek yapmamız gereken:

$! cl

ve düğmesine basın Enter. Peki ya vim? Bu kadar basit:

$!

Hayalci'nin tepkisinden en önemli nokta , shoptyerleşik yapıya yapılan çağrıdır :

$ shopt -s histverify

Böylece bu tarih doğrulamayı sağlayacak tarafından eşleştirilen komutlar !, !!ve !?koordinat belirleme körlemesine yürütülen, ancak onları çalıştırmadan önce hiçbir kötülük yapacak sağlamak böylece yerine komut satırında doldurulur verilmez. Kök kullanıcı olarak komutları çalıştırırken bu daha da önemlidir. Bu seçenek .bashrcbaşlangıç ​​dosyanızda, giriş yaptığınızda ayarlanacak şekilde ayarlanabilir.

Daha önce de belirtildiği gibi, bu bilgilerin tamamı bashman sayfasından toplanabilir . İçin!, !!, ve!? İşaretçilere bakınız Bölüm 9.3 Tarihçe Genişletme .


39
+1 Tüm sistemler için 12 yıldan fazla bir süredir Linux kullanıyorum. Bunun var olduğunu bilmiyordum. Keşke +10'u nasıl özledim?
Aiden Bell,

1
Birçok sistemde, yukarı okuna basmak aynı şeydir.
mas,

Eğer biri '!', '!!', '!?', 'Tarihini birleştirecekti | grep 've' ctrl-r 'kapsamlı bir cevap haline getirdim, onu
seçerdim

shoptbash_profile (bash_profile değil) (ya da giriş kabukları olmayan kabukları için etkin olmayacak) gider.
Tobu,

2
Ayrıca CTRL + R tuşlarına bastıktan sonra, önceki komuta geri dönmek için CTRL + ÜST KRKT + R tuşlarını birkaç kez kullanabilirsiniz
Gal Bracha

37

Alternatif olarak crtl+R, yazarak geçmişi arayabilirsiniz.

!text

Bu, 'text' ile başlayan en son komutun geçmişini arayacaktır .

Ancak yanlış komutun yürütülmesini önlemek için bunu .bashrc içine koymanızı öneririm.

shopt -s histverify

Bu, bash'a, herhangi bir tarih eyleminden sonra (gibi !!:s/prev_text/after_text), sonuç satırını komut istemine yerleştirmesini söyler . Sonra komutu gözden geçirebilir veya düzenleyebilir ve ardından Enter tuşuna basabilirsiniz.


5
"Text" içeren en son komutu yeniden çalıştırmak için!? Text komutunu kullanın.
mark4o

3
Eğer biri '!', '!!', '!?', 'Tarihini birleştirecekti | grep 've' ctrl-r 'ile kapsamlı bir cevap içine seçerdim.
Richard Hoskins,

32

Ayrıca şunları da yapabilirsiniz:

history | grep "stuff"

gibi bir şey dönecekti

num stuff

o zaman yazabilirsin

!num

15

Geriye dönük arama geçmişi yerine geçmiş-geriye doğru kullanmayı tercih ediyorum. Birincisi, komutun birkaç karakterini yazmanıza izin verir, sonra arama tuşuna basarak ilk önce arama tuşuna basıp arama dizesini yazabilirsiniz .

Sistemimde varsayılan olarak, Mp ve Mn benzer işlevlere bağlanır, ancak ok tuşlarını bağlamayı tercih ederim:

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

13

Gerçekten harika bir takma adıma sahibim, h. Gerçekten sadece "history | grep", fakat önceki "h" komutunu "grep -E -v" ile filtreledim.

alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "

gibi kullanılan

h aliases
2003  less .bash_aliases

1
Bu, komutu ekleyerek de yapılabilir HISTIGNORE.
tanenbring

12

Mükemmel yazı, Sean! Bunu bir yoruma ekledim ama utangaç birkaç puanım var. :-)

Bir başka ilgili ve kullanışlı teknik, bir kelimeyi değiştirirken önceki bir komutu çalıştırma yeteneğidir. Dizin adını yazdığınızı veya dosya adını değiştirmek istediğinizi söyleyin:

$ echo benim adım bob
benim adım Bob
$ ^ bob ^ Ürdün
yankı benim adım Jordan
Benim adım Jordan

Komutun çalıştırılmasından önce komutun genişletildiğine, değiştirildiğine ve çıktısının alındığına dikkat edin, böylece yanlış komut çalıştırılırsa ne yaptığını düşündüğünüzü görebilirsiniz.


6

Ctrl-r kullanarak tarih boyunca gezinme IMO hantal olduğu için, ss düşünmek isteyebilirsiniz :

https://github.com/dvorka/hstr

gezinmeyi çok daha basit, basit ve verimli kılar - komutu çalıştırmak da dahil olmak üzere:

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


Bu nasıl kullanılır? Bu resmi görmek için hangi tuşlara basmanız gerekir?
Nakilon

2
Hh'yi yükledikten sonra ya hh komutunu kullanabilir VEYA belgelerde açıklandığı şekilde herhangi bir klavye kısayoluna (genellikle Ctrl-r) bağlayabilirsiniz.
Martin Dvorak

ctrl + rşimdi varsayılan olarak bağlanır
Alleo

4

Bash komut isteminde, control-R yazın, sonra istediğiniz komutun birkaç karakterini yazın ve bash'in readline özelliği bu komut için komut geçmişini arayacaktır.

Aramayı başlattıktan sonra, bir sonraki eşleştirme komutuna atlamak için control-R tuşlarına tekrar basabilirsiniz.


3

viKabukunuzu anahtar bağlamaları ( set -o viveya set editing-mode viiçinde olanları) kullanacak şekilde yapılandırdıysanız , komut satırı geçmişinde dolaşmak için $HOME/.inputrcarama yapın <Esc>/some-command<Return>ve n(sonraki) veya Shift-n(önceki) tuşuna basın.


Bu vim kullanıcılarına en yakın olanıdır.
Gabor Marton

2

CTRL+ R@ John1024'ün önerdiği gibi gayet iyi çalışıyor, ancak son komutlarınızın çoğu benzerse ve hepsini taramak için hızlı bir yol istiyorsanız biraz sıkıcı. Bir alternatif kullanmak olacaktır history:

$ history | grep keyword

0

HSTR'yi severim ama bazen yükleyemiyorum. Bu yüzden , davranışını taklit eden fzf kullanarak bir takma ad yazdım ( hx"tarih yürütme" için)

alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
  • history : öyleyse geçmiş olsun
  • sed : Sayı sütununu listeden kaldır (POSIX)
  • fzf: işte sihir, listede etkileşimli olarak arama yapmanızı veya ile birlikte hareket etmenizi C-Jve C-Kardından bir komut çalıştırmanızı sağlar Enter.
  • --height : gösterilen satırların sayısını ayarlamanızı sağlar.
  • --tac : listeyi geri al (geçmiş için daha mantıklı)
  • --tiebreak=index : fzf sonuçları güncellediğinde tarih sırasını sakla
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.