Bash'ta geçmişi arayabilir ve sonucu çalıştırabilir miyim?
Bash'ta geçmişi arayabilir ve sonucu çalıştırabilir miyim?
Yanıtlar:
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. bash
Adam 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ı history
yerleş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
clear
Komutu yürütecek . Tarihin yerleşik bir çok özelliği vardır, bash
ve history
man sayfalarında daha fazlasını görebilirsiniz .
Göstergeyi kullanırken göreceli negatif sapmaları da belirtebilirsiniz !
, bu nedenle yukarıdaki tarih listemizi kullanarak, vim
tekrar 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 , bash
baş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, clear
tekrar 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 , shopt
yerleş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 .bashrc
başlangıç dosyanızda, giriş yaptığınızda ayarlanacak şekilde ayarlanabilir.
Daha önce de belirtildiği gibi, bu bilgilerin tamamı bash
man sayfasından toplanabilir . İçin!, !!, ve!? İşaretçilere bakınız Bölüm 9.3 Tarihçe Genişletme .
shopt
bash_profile (bash_profile değil) (ya da giriş kabukları olmayan kabukları için etkin olmayacak) gider.
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.
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'
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
HISTIGNORE
.
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.
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:
ctrl + r
şimdi varsayılan olarak bağlanır
vi
Kabukunuzu anahtar bağlamaları ( set -o vi
veya set editing-mode vi
içinde olanları) kullanacak şekilde yapılandırdıysanız , komut satırı geçmişinde dolaşmak için $HOME/.inputrc
arama yapın <Esc>/some-command<Return>
ve n
(sonraki) veya Shift-n
(önceki) tuşuna basın.
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ş olsunsed
: Sayı sütununu listeden kaldır (POSIX)fzf
: işte sihir, listede etkileşimli olarak arama yapmanızı veya ile birlikte hareket etmenizi C-J
ve C-K
ardı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