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ı?
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ı?
Yanıtlar:
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, eval
satı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
Tarihte bir dizi komutu görüntülemek için yerleşik fc
komutu kullanın:
fc -ln 432 435
Onları tekrar yürütmek için:
eval "$(fc -ln 432 435)"
man fc
bana hiçbir şey vermiyor. Ne anlama geliyor fc
? Başka ne seçenekler var?
help fc
... ve ayrıca help help
.... yardım: yardım [-dms] [desen ...] Yerleşik komutlarla ilgili bilgileri görüntüleyin.
-l
, kötülüğe ihtiyaç duymadan çalışacaktır eval
.
fc
" komut bul "veya" düzeltme komutu "anlamına geliyor.
Bash geçmişinden bir dizi komutu çalıştırmak için hoş ve alternatif bir yol vardır:
tarih yerine ( !432
veya !-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.
Ctrl-o
sonra sadece bir hazır bilgi çıktı ^o
ve kırdı (reverse-i-search)
. Belki ilgili başka bir ayar vardır.
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.
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
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 .