Tarihten ardışık komutlar nasıl uygulanır?


49

Diyelim ki daha önce yürüttüğüm dört komutun bir dizisini yürütmek istiyorum. İlki komut geçmişinde 432 ise, ben yapabilirdim:

$ !432; !433; !434; !435

Merak ediyorum, bunu başarmanın daha etkili bir yolu var mı?


1
Bu komutları bir cevap olarak yayınlamamaktadır, çünkü komutları yerine getirmez , ancak history -p \!43{2..5}sonraki kopyala / yapıştır işlemine uygun olan 432 ile 435 arasındaki komutları terminale yazdırmak için yazabilirsiniz .
Joker

Yanıtlar:


48

Sadece yakın zamanda çalıştırılan komutlara atıfta bulunuyorsa, daha etkili bir yol, bunlara negatif sayılarla başvurmaktır:

!-4; !-3; !-2; !-1

Ayrıca, bir kez yaptığınızda, son tarih girişiniz tüm komut zincirini içerecek, böylece tekrarlayabilirsiniz !!.


Düzenleme: Henüz varsa, büyük bir yerleşik işlevi tanımak fc, Gilles tarafından belirtildiği . (Kullan help fc.) Yanında negatif sayılar da kullanabileceğinizi gösterir, böylece yukarıdakileri kullanarak da aynı şeyi yapabilirsiniz.

eval "`fc -ln -4 -1`"

Bununla birlikte, bir ihtarı vardır: bundan sonra, evalsatır son komut olarak tarihe kaydedilir. Eğer bunu tekrar yaparsanız, bir döngüye girersiniz!

Bunu yapmanın daha güvenli bir yolu, varsayılan fcçalışma modunu kullanmaktır : seçilen komut dizisini bir editöre iletmek ve ondan çıktıktan sonra çalıştırmak. Deneyin:

 fc -4 -1

Komutların sırasını bile tersine çevirebilirsiniz: fc -1 -4


Ne yazdığımı okudum ... LOL. Aslında emin değilim reinvoke ( reinvoke belki?) Ancak söylediğin için teşekkürler :) Hep düzeltmeleri için teşekkür ederiz.
rozcietrzewiacz 16:11

Scrabblefinder.com, reinvoke'nin geçerli bir Scrabble kelimesi olduğunu söylüyor. Bundan daha kesin olamaz. :)
BentFX

1
Bunun gibi iyi bir cevapla (+1), nasıl hecelemeniz önemli değil; ne yazım şekli 3'te gösterir özellikle büyük İngiliz sözlükleri: Oxford, Camgridge, Merriam-Webster, (I tire için gider)
Peter.O

34

Tarihte bir dizi komutu görüntülemek için yerleşik fckomutu kullanın:

fc -ln 432 435

Onları tekrar yürütmek için:

eval "$(fc -ln 432 435)"

4
Çok hoş. Yine de merak ediyorum, neden man fcbana hiçbir şey vermiyor. Ne anlama geliyor fc? Başka ne seçenekler var?
Eric Wilson

2
@Eric Wilson ... yazın help fc... ve ayrıca help help.... yardım: yardım [-dms] [desen ...] Yerleşik komutlarla ilgili bilgileri görüntüleyin.
Peter.O

Buraya daha yeni geldim, cevabını aradım. Bu gerçekten harika bir yapı! Özellikle de varsayılan işlevi olduğunuzda - tekrarlanacak bir dizi komutu değiştirmek için bir editör çağırmak. Sağol Gilles.
rozcietrzewiacz

1
Bayraksız -l, kötülüğe ihtiyaç duymadan çalışacaktır eval.
Bernhard

1
@EricWilson Bir google araştırması beni "kısaca" Unix " kitabına yönlendirerek, fc" komut bul "veya" düzeltme komutu "anlamına geliyor.
Slothworks

10

Bash geçmişinden bir dizi komutu çalıştırmak için hoş ve alternatif bir yol vardır:
tarih yerine ( !432veya !-4) kullanmak yerine, Ctrl+ ile geçmiş arasında arama yapabilirsiniz rve istediğiniz ilk komutu bulduğunuzda koşmak, tuşun yerine Ctrl+ o( ope-ve-get-next ) returntuşuna basın.
Bu , komutu başlatacak ve geçmişten bir sonrakini önerecektir . Dilediğiniz Ctrl+okadar süre vurabilir ve diziyi returnsonuncusu için sona erdirebilir veya Ctrl+cbaşlatmadan durabilirsiniz.


Hmm, vurduktan Ctrl-osonra sadece bir hazır bilgi çıktı ^ove kırdı (reverse-i-search). Belki ilgili başka bir ayar vardır.
Ciro Santilli,

8

Komutları düzenlemek yerine hemen yerine getirmek için, işte eval kullanarak değerlendirmede Giles cevaplarının daha ince ve daha zayıf bir sürümü :

fc -e: 432 435

-E için kolon argümanı, fc'nin istediği "editörde aç" adımını atlama etkisine sahip bash noop'tur. Ayrıca, şimdi (yeni) geçmiş, eval ifadesinden ziyade, tarihteki gerçek komutları içerecektir.


0

fc döngü için ve xsel

Son n komutlarını birkaç kez birleştirmek ve yeniden çalıştırmak istediğimde bu iyi çalışıyor:

fcn() (
  from="${1:-2}"
  to="${2:-1}"
  if [ "$from" -ne "$to" ]; then
    for i in `seq "$from" -1 "$(($to + 1))"`; do
      printf "$(fc -ln -${i} -${i}) && "
    done
  fi
  printf "$(fc -ln -${to} -${to})"
)

Sonra:

$ echo a
a
$ echo b
b
$ echo c
c
$ fcn 3 1 | xsel -b
$ # Paste.
$  echo a &&  echo b &&  echo c
a
b
c
$ # Paste again if you feel like it.
$  echo a &&  echo b &&  echo c
a
b
c

Veya biraz düzenlemeye ihtiyaç duyan daha büyük komutlar için:

fcn 3 1 >cmds.sh
vi cmds.sh
bash cmds.sh
bash cmds.sh
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.