Tarihten komutları çalıştırmanın bir yolu var mı?


99

Örneğin:

[root@ip-10-0-7-125 ~]# history | grep free
  594  free -m
  634  free -m | xargs | awk '{print "free/total memory" $17 " / " $ 8}'
  635  free -m
  636  free -m | xargs | awk '{print "free/total memory" $9 " / " $ 10}'
  736  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $9}'
  740  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $8}'
  741  free -m | xargs | awk '{print "free/total memory: " $17 " / " $8 " MB"}'

636 komutunu tekrar yazmadan çalıştırmanın bir yolu olup olmadığını merak ediyorum, sadece bir şey artı sayı, tarihçe 636 gibi bir şey yazın.


14
Eğer nereden biliyorsun ctrl-r?
Carlos Campderrós

1
Evet, biliyorum ama tam olarak istediğim bu değil.
Bir

Yanıtlar:


170

Bash, sadece iyi !636olacak.


12
In Linux- Bunun üzerinde çalışan bir kişinin çalıştığı işletim sistemi (bash, zsh, etc) ile daha fazla ilgisi var. Linux'ta tarih desteği olmayan mermiler var.
Zoredache

@Zoredache Ve benzer şekilde, bu Windows'ta bash uygulamalarının çoğunda iyi çalışır.
Ajedi32

1
Elbette sadece bash değil, diğer kabukları da - csh dahil.
Drew

5
Çalıştırmak istediklerinize çok benzeyen bir komutunuz :pvarsa, !636:pörneğin komutu çalıştırmadan komutu yazdırmak için ekleyebilirsiniz . Bu da yukarı oka basarak tarihinizden kolayca tekrar seçebileceğiniz ve istediğiniz küçük değişiklikleri yapabileceğiniz anlamına gelir
AJefferiss

78

Evet, buna "tarih genişletme" denir. Görmek

LESS='+/^HISTORY EXPANSION' man bash

tüm detaylar için.

Bir sayının ardından bir ünlem işareti kullanmak tartışmasız en basit kullanımdır:

!636

Ancak, son çalıştırılan komutu, geçmiş numarasını bilmeden doğrudan çalıştırabilirsiniz:

!!

Veya iki komutu geri çalıştırabilirsiniz:

!-2

Ancak en sık kullandığım form, son komutun son argümanını tekrarlamaktır:

echo this text goes into a file > /tmp/afile.txt
cat !$

Ya da bir dosyayı inceliyorum diyelim. Sekme tamamlamayı kullanarak aşağıdakileri yapabilirim:

ls -l /really/long/path/to/some/file
less !$

Yine, daha fazla ayrıntı için man sayfasını okuyun :

LESS='+/^HISTORY EXPANSION' man bash

25
İnteraktif olarak, Alt-.daha uygun olabilir !$. Bu son komutun son argüman ekler kelimesi kelimesine hattına.
ulidtko

2
@ ulidtko Bu özel kaçışlar nerede belgelenmiş (ben biliyordum !$ama hiç duymadım Alt-.)? Bir link gönderir misiniz lütfen?
edmz

5
LESS="+/DEFAULT KEY BINDINGS" man 3 readline, /etc/inputrc, ~/.inputrc. Bash dışında birçok program libreadline'ı kullanır; Yapanlar için Alt-., Ctrl-X-U(geri al), Ctrl-/(kısayolu açıkla), sekme tamamlama, vb. aynı özellikleri ücretsiz alırsınız . Örneğin, bir satırın sadece üç satırı ile stok python REPL'dePYTHONSTARTUP sekme tamamlama ve geçmişe izin verebilirsiniz . Çalışacak olan (çoğunlukla) bash ile aynıdır, çünkü işi yapan GNU Readline kütüphanesidir. Readline'ın kılavuz sayfası özellikleri ayrıntılı olarak açıklar.
ulidtko

2
Ayrıca, Ctl-UpArrow (veya bash'daki AltUpArrow) geçmiş listesinde geriye doğru kayar. Birkaç karakter yazdıktan sonra, UpArrow sadece bu harfle başlayan komutları alır, örneğin "fr (Ctl-Up)", OP listesindeki tüm "free ..." komutlarını kaydırır. Bu, gnuplot ve gdb gibi, readline kullanan şeylerde de işe yarar.
jamesqf

2
@ Ajedi32, cevabımdaki son koyu çizgiye bakın. :) Gerçekten de bu cevap, tarih genişlemesinin yapabileceği şeylerin zar zor bir tadı . Bunun, çağırdığınız komutun değil kabuk düzeyinde olduğunu unutmayın; bu nedenle echo {1..5}ardından sadece bir tane değil beş dosyaya touch !$dokunulur . Bu yüzden kesinlikle söylemek gerekirse, bu son argüman değil, bu satırdaki son kabuk sözcüğüdür. (Ayrıca bunu takip etmeyi deneyin .) Düzenlemeyi önermek için çekinmeyin. echo hello >tempecho goodbye !$
Wildcard

14

Güzel bir tane, eğer ilk tarihe geçmek istemiyorsanız, numarayı not edin, vb:

bash (ve belki başkaları):

ctrl-r something 

( ctrl-r= "etkileşimli aramayı ters çevir") ( something= önceki komutun bir parçası)

Bu size içeren en son tarih çizgisini gösterecektir something. Daha önce bir tane almak için, her önceki satırda ctrl-r (yalnız) tekrar yapın.

örn:

ctrl-r  10

'10' içeren en son tarih çizgisini göstermek için (örneğin, örneğinizdeki çizgiyi $10örneklemek için) ve ctrl-rtekrar aradığınız tarih çizgisini alana kadar

İstediğin çizgi göründüğünde, sadece Enterçalıştırmak için (veya ayrıca kullanarak düzenleyebilirsiniz arrow keys, backspaceve ctrl-a, satırın başına gitmek için ctrl-e, End almak için ctrl-k: imlecin bulunduğu yerden satır sonuna kadar "öldürmek" için (= siler + onu tamponda saklar) ctrl-y,: tampondan, daha önce öldürülmüş bir biti geri yüklemek, vb.)

İleriye doğru arama yapmak istiyorsanız (ctrl-s), önce XON'u devre dışı bırakmanız gerekir : bkz. Https://stackoverflow.com/a/791800/1841533 :

"yalnızca çalıştırarak XON / XOFF’ı devre dışı bırakmak için

stty -ixon

"(ve ctrl-s'yi terminali dondurmadan kullanabileceksiniz)


Bunu yaparsam ve yanlışlıkla bir kez çok fazla ctrl-r tuşlarına basarsam, tarihte yeniden arama yapmanın bir yolu var mı?
kasperd

@ kasperd: Evet yapabilirsiniz. hakkında birçok cevap işaret: ileri arama için ctrl-s.
Olivier Dulac

Ne yazık ki ctrl-s terminali dondurmak için kullanılır ve bash bunu devre dışı bırakmaz, bu nedenle varsayılan yapılandırmada çalışmaz. (Diğer programlar -
emac

@ kasperd: Evet, bunu daha önce söylemediğim için üzgünüm ("çok fazla cevabı" işaret ettim, çünkü bunu kesin olarak yapıyorlardı, ama bunu yorum yazmak veya bağlantı vermek için zaman ayırmadım ... ( şimdi telefona geri döndüm ve yukarıdaki cevabı değiştirebildim: bash geçmişi araştırması için ctrl-s'nin önce stty -ixon'a ihtiyacı var
Olivier Dulac

Bu komut normal ctrl-s kullanımını kıracak, yani bu gerçekten bir seçenek değil.
kasperd

7

Kabuk yerleşik kullanabilirsiniz fc :

fc -s 636

2
Bu aslında kabul edilen cevaptan daha iyidir, ancak -sfaydalardan yararlanmak için bunları kaldırmanız gerekir . Eğer çalıştırırsanız fc 636bir açılacaktır editörü tamponu içinde geçmişinizden komutuyla 636 ile ve ne zaman idare edilecek kaydedip komutu çıkın (değiştirilmiş veya değil). Ve daha da iyisi, bu POSIX uyumludur .
Wildcard

@StevenPenny Teşekkürler. Ve evet, POSIX'in ne olduğunu biliyorum, ancak alaka düzeyini göremiyorum. Her şeye rağmen, kolayca erişilebilen ve eklenen bazı belgeler iyi olurdu.
Faheem Mitha

@FaheemMitha "Yardım fc" çalıştırmayı deneyin.
Joker

@Wildcard helpPOSIX değil - yapmak man dashya da benzer olabilir
Steven Penny

@Wildcard Teşekkürler. Var olduğunu unutma eğilimindeyim help. Yerleşik başka bir kabuk. Ve yeni bir sistem için yardım isteyebilecek, ancak bunun yerine bir saçma akışla karşı karşıya kalabilecek istenmeyen kullanıcılar için şaşırtıcı. :-(
Faheem Mitha

3

Orada HSTR- hhkomuta bashve zshinteraktif komut seçimi, Ctrl-R arama ters daha iyi:

ss etkileşimli tarih komutu örneği

etkileşimli olduğundan, çalıştırmadan önce komutu arayabilir ve düzenleyebilirsiniz.

Ubuntu'da hhaşağıdaki tek astarla yükleyebilirsiniz :

sudo add-apt-repository ppa:ultradvorka/ppa && sudo apt-get update && sudo apt-get install hh && hh --show-configuration >> ~/.bashrc

veya adım adım:

sudo add-apt-repository ppa:ultradvorka/ppa
sudo apt-get update
sudo apt-get install hh

hhFedora, RHEL veya CentOS'a kurun :

sudo dnf|yum install hstr -y

MacOS'ta homebrew:

brew install hh

... sonra şununla yapılandırın:

hh --show-configuration >> ~/.bashrc

Bu, varsayılan Ctrl-R davranışının yerini alacak.

hh --show-configurationBash profilinize ne ekleneceğini belirlemek için çalıştırın .

Github'daki proje ana sayfasında daha fazla yapılandırma seçeneği mevcut: https://github.com/dvorka/hstr

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.