Bas geçmişinde bir dizi komut yürütmek için bir kısayol var mı?


20

Farz edelim ki şu önemsiz örneğim var history:

...
76 cd ~
77 ./generator.sh out.file
78 cp out.file ~/out/
79 ./out/cleaner.sh .
80 ls -alnh /out
...

Ben komutları yürütmek istiyorsa 77, 78ve 79bir komuta, bunun için bir kısayol var vardır? Denedim !77 !78 !79, yürütmek için hepsini tek bir satıra yerleştireceğim.


9
!77 ; !78 ; !79tamam mı?
17'de

1
Sanırım şey (çizgisinde daha özlü bit çizgi ile yazarak hattının kısa Tamam, ama bir şey a umuyordum !77-79)
MrDuk

1
@ MrDuk, oğlum bunu hatırlamam biraz zaman aldı. Çok özlü çözüm için güncellenmiş cevabımı görün ! :)
Wildcard

Büyüleyici! :)
MrDuk

Yanıtlar:


28

DÜZENLEME: Bunu düzeltme komut aracıylafc POSIX uyumlu bir şekilde yapabilirsiniz :

fc 77 79

Bu, düzenleyicinizi (muhtemelen vi) arabellekteki 77 ila 79 komutlarıyla açar . Kaydettiğinizde ( :x) çıktığınızda , komutlar çalıştırılır.


Bunları düzenlemek istemiyorsanız ve hangi komutları aradığınızı bildiğinizden ÇOK eminseniz, şunları kullanabilirsiniz:

fc -e true 77 79

Bu true, komutları düzenlemek için bir "düzenleyici" olarak kullanır , bu nedenle herhangi bir değişiklik yapmadan çıkar ve komutlar olduğu gibi çalıştırılır.


ORİJİNAL CEVAP:

Kullanabilirsiniz:

history -p \!{77..79} | bash

Bu, elbette başlatılmakta olan yeni kabukta kullanılamayacağı için, yalnızca geçerli yürütme ortamında mevcut olan takma adlar, işlevler veya değişkenler kullanmadığınızı varsayar.


Daha iyi bir çözüm (yorumlarda bana hatırlattığı için Michael Hoffman'a teşekkürler):

eval "$(history -p \!{77..79})"

evalGerçekten uygun olan çok, çok az durumdan biri!


Ayrıca bakınız:


2
Komutlardan herhangi Bu doğru çalışmaz değiştiren bir değişken değiştirme veya yaparak, örneğin, mevcut işletme ortamı cd, ama bu, bir kenar durumdur.
G-Man, 'Monica'yı Yeniden Başlat' diyor

3
eval "$(history -p \!{77..79})"çalışmalı.
Michael Hoffman

1
@MichaelHoffman, bunu düşünmüştüm ve denediğimi düşündüm, ama alıntı yapmayı bıraktığımı fark ettim! D'oh! İşe yaramadığına şaşmamalı ... cevabı şimdi düzenliyor.
Wildcard

14

Basit cevap: yerine !77 !78 !79,

  • tip !77; !78; !79yapmaya çalıştığını gibi görünüyor ne yapacağını - komutu 77 yürütmek ve sonra 78 komuta ve sonra komuta 79, koşulsuz ya
  • yazın !77 && !78 && !79 komutu 77 yürütmek ve onu başarılı olup olmadığını kontrol etmek. Ve sonra, komut 77 başarılı olursa, komut 78'i çalıştırın. Ve sonra, komut 78 başarılı olursa, komut 79'u yürütün.

Biraz daha akıllıca cevap (terminal tipi bir penceredeyseniz):

  • Yazdığınız bir sonraki komutun hangi komut numarasını olacağını belirleyin.
    • Bunu isteminize dahil etmek mümkündür; Ben \!senin içine dahil ederek inanıyorum PS1.
    • Veya geçmiş girişinize bakın. Son giriş ise 82 history, bir sonraki komutunuz 83'tür.
  • 83−77 = 6 çıkarın.
  • Tür !-6. Bu komut 77'yi yeniden çalıştıracaktır.
  • Öğesini seçin !-6, kopyalayın ve yapıştırın. Komut 77 ( ./generator.sh) yeniden yürütmeniz komut 83 olduğundan, şimdi komut 84'desiniz, bu nedenle !-6komut 78'i yeniden yürütürsünüz.
  • Yapışmayı !-6istediğiniz gibi tekrarlayın .
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.