it-swarm.asia

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

Bash'ta geçmişi arayabilir ve sonucu çalıştırabilir miyim?

288
Richard Hoskins

Tip CtrlR Komut satırında ve önceki komutu yazmaya başlayın. Bir sonuç göründüğünde vurmaya devam et CtrlR diğer maçları görmek için İstediğiniz komut görüntülendiğinde, tuşuna basın. Enter

Bunu yaparken CtrlR komutunun (reverse-search-history) bağlanmasını istiyorsanız, varsayılan CtrlT Bunu aşağıdaki şekilde yapılandırabilirsiniz:

 '"\ C-t" kelimesini bağla: ters arama geçmişi' 

Sizin için de kullanılabilen bir dizi başka okuma satırı ikili komutları vardır. bashman sayfasına bakın .

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şimidir. Sadece yazarak:

 $ tarih 

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

 $ history 
 1 temizle 
 2 ls -al 
 3 vim ~/somefile.txt 
 4 tarih 
 $ 

Daha sonra bu komutlardan herhangi birini, sayısal bir dizini kullanarak, dizini tek bir ! ile seçerek, Mitch belirtildiği gibi çalıştırabilirsiniz:

 $! 1 

clearkomutunu çalıştırır. Geçmişin birçok özelliği vardır, bashve historyman sayfalarında daha fazlasını görebilirsiniz.

! göstergesini kullanırken de göreceli negatif ofsetler belirleyebilirsiniz, bu nedenle yukarıdaki tarih listemizi kullanarak, eğer vimişlevini tekrar çalıştırmak 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 !! (sadece !-1 için kısayol olan) kullanabilirsiniz.

! tasarlayıcısı, hangi komutu çalıştıracağınızı sayısal olarak belirlemenizi sınırlamaz. hayalci , bashkomutuyla başlayabilen metne (! kullanarak) veya komutun içindeki metne (!? kullanarak) dayalı bir komut yürütmesini söyleyebileceğinizi gösterdi. Yine, yukarıdaki örnek tarihçe listemizi kullanarak, clearişlevini yeniden yürütmek istiyorsak tek yapmamız gereken tür:

 $! cl 

ve bas Enter. Peki ya vimname__? Bu kadar basit:

 $!? some 

hayalci 'nin cevabındaki en önemli nokta, shoptyerleşikine yapılan çağrıdır:

 $ shopt -s histverify 

Bu, tarih doğrulamasını etkinleştirir, böylece !, !! ve !? göstericilerinin eşleştirdiği komutlar kör bir şekilde yürütülmez, ancak komut satırında doldurulur, böylece çalıştırmadan önce kötülük yapmamalarını sağlayabilirsiniz. Kök kullanıcı olarak komutları çalıştırırken bu daha da önemlidir. Bu seçenek, .bashrc başlangıç ​​dosyanızda, giriş yaptığınızda ayarlanacak şekilde ayarlanabilir.

Daha önce de belirtildiği gibi, bu bilgilerin tümü bashman sayfası içinden toplanabilir. İçin!, !!, ve!? İşaretçilere bakınız --- 9.3 Tarih Genişleme .

421
Sean Bright

Alternatif olarak crtl+Ryazarak geçmişi arayabilirsiniz.

!text

Bu işlem, 'text' ile başlayan en yeni komutun başlamasını 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 geçmiş işleminden sonra (!!:s/prev_text/after_text gibi), sonuç satırını İstem komutuna yerleştirmesini söyler. Ardından komutu gözden geçirebilir veya düzenleyebilir ve ardından Enter tuşuna basabilirsiniz.

36
hayalci

Ayrıca şunları da yapabilirsiniz:

history | grep "stuff"

gibi bir şey dönecekti

num stuff

o zaman yazabilirsin

!num
30
Mitch

Geriye dönük arama geçmişi yerine geçmiş-geriye doğru kullanmayı tercih ediyorum. İlki, önce arama tuşuna basarak, sonra arama dizesini yazarken, ardından komutunun birkaç karakterini yazmanıza izin verir.

Sistemimde varsayılan olarak, M-p ve M-n 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'
14
Keith

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
12
CurtH

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

Başka bir ilgili ve faydalı teknik, bir Word'ü 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 
 ismim bob 
 $ ^ bob ^ jordan 
 echo 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.

12
Jordan

Ctrl-r kullanarak tarih boyunca gezinme IMO hantal olduğu için hh :

https://github.com/dvorka/hstr

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

enter image description here

5
Martin Dvorak

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

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

3
John1024

Shell'iniz vi key bindings (set -o vi veya set editing-mode vi'da $HOME/.inputrc sahip) kullanmak üzere yapılandırılmışsa, komut satırı geçmişinde dolaşmak için <Esc>/some-command<Return> ile arama yapın ve n (sonraki) veya Shift-n (önceki) tuşlarına basın.

3
Fernando Basso

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 historyNAME _ :

$ history | grep keyword
2
Mureinik

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

alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
  • history: geçmişini al
  • sed: listeden sayı sütununu kaldır (POSIX)
  • fzf: işte sihir, listede etkileşimli olarak arama yapmanızı veya C-J ve C-K ile hareket etmenizi sağlar, ardından Enter ile bir komut çalıştırmanızı sağlar.
  • --height: gösterilen satır sayısını ayarlayın.
  • --tac: listeyi geri döndür (geçmiş için daha mantıklı)
  • --tiebreak=index: fzf sonuçları güncellediğinde tarih sırasını korur
0
Biggybi