ทางลัดสำหรับการดำเนินการชุดคำสั่งในประวัติทุบตีอยู่หรือไม่?


20

สมมติว่าฉันมีตัวอย่างเล็ก ๆ น้อย ๆ ต่อไปนี้ในhistory:

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

ถ้าผมต้องการที่จะรันคำสั่ง77, 78และ79ในคำสั่งอย่างใดอย่างหนึ่งไม่มีอยู่ทางลัดสำหรับการนี้หรือไม่? ฉันได้ลอง!77 !78 !79แล้วซึ่งจะทำให้พวกเขาทั้งหมดในบรรทัดเดียวเพื่อดำเนินการ


9
คือ!77 ; !78 ; !79โอเค?
thrig

1
ฉันเดาอะไรสั้นของสายการพิมพ์โดยสายก็โอเค แต่ก็หวังว่าบางสิ่งบางอย่างบิตรัดกุมมากขึ้น (ตามสายของ!77-79)
MrDuk

1
@MrDuk เด็กชายทำอย่างนั้นฉันใช้เวลาในการจำ ดูคำตอบที่อัปเดตของฉันสำหรับวิธีแก้ปัญหาที่รัดกุมมาก ! :)
สัญลักษณ์แทน

มันวิเศษมาก! :)
MrDuk

คำตอบ:


28

แก้ไข: คุณสามารถทำได้ใน POSIX- สอดคล้องกับแฟชั่นด้วยเครื่องมือคำสั่งแก้ไขfc :

fc 77 79

สิ่งนี้จะเปิดตัวแก้ไขของคุณ (อาจvi) ด้วยคำสั่ง 77 ถึง 79 ในบัฟเฟอร์ เมื่อคุณบันทึกและออก ( :x) คำสั่งจะถูกเรียกใช้


หากคุณไม่ต้องการที่จะแก้ไขพวกเขาและคุณแน่ใจว่าคุณรู้คำสั่งที่คุณโทรคุณสามารถใช้:

fc -e true 77 79

สิ่งนี้ใช้trueเป็น "ตัวแก้ไข" เพื่อแก้ไขคำสั่งด้วยดังนั้นจึงออกโดยไม่ต้องทำการเปลี่ยนแปลงใด ๆ และคำสั่งจะทำงานตามที่เป็นอยู่


คำตอบเดิม:

คุณสามารถใช้ได้:

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

นี่ถือว่าคุณไม่ได้ใช้นามแฝงหรือฟังก์ชั่นหรือตัวแปรใด ๆ ที่มีอยู่ในสภาพแวดล้อมการดำเนินการปัจจุบันเท่านั้นแน่นอนว่าสิ่งเหล่านั้นจะไม่สามารถใช้ได้ในเชลล์ใหม่ที่กำลังเริ่มต้น


ทางออกที่ดีกว่า (ขอบคุณ Michael Hoffman ที่เตือนฉันในความคิดเห็น) คือ:

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

หนึ่งในกรณีน้อยมากที่evalเหมาะสมจริงๆ!


ดูเพิ่มเติมที่:


2
สิ่งนี้จะไม่ทำงานอย่างถูกต้องหากคำสั่งใด ๆเปลี่ยนสภาพแวดล้อมการดำเนินการปัจจุบันเช่นโดยการเปลี่ยนตัวแปรหรือทำ a cdแต่นั่นเป็นกรณีขอบ
G-Man กล่าวว่า 'Reinstate Monica'

3
eval "$(history -p \!{77..79})"ควรทำงาน.
Michael Hoffman

1
@MichaelHoffman ฉันคิดอย่างนั้นและคิดว่าฉันได้ลองแล้ว แต่ฉันเพิ่งรู้ว่าฉันไม่ได้พูดอะไรเลย! D'โอ้! ไม่น่าแปลกใจที่มันไม่ทำงาน ... คำตอบสำหรับการแก้ไขตอนนี้
Wildcard

14

คำตอบง่ายๆ: แทน!77 !78 !79,

  • พิมพ์!77; !78; !79เพื่อทำสิ่งที่คุณพยายามทำ - ดำเนินการคำสั่ง 77 จากนั้นสั่งคำสั่ง 78 จากนั้นสั่งคำสั่ง 79 โดยไม่มีเงื่อนไขหรือ
  • พิมพ์!77 && !78 && !79 เพื่อดำเนินการคำสั่ง 77 และตรวจสอบว่ามันประสบความสำเร็จ จากนั้นหากคำสั่ง 77 สำเร็จให้ดำเนินการคำสั่ง 78 จากนั้นหากคำสั่ง 78 สำเร็จให้ดำเนินการคำสั่ง 79

คำตอบที่ฉลาดเล็กน้อย (ถ้าคุณอยู่ในหน้าต่างประเภทเทอร์มินัล):

  • คิดออกว่าหมายเลขคำสั่งใดคำสั่งถัดไปที่คุณพิมพ์จะเป็น
    • เป็นไปได้ที่จะรวมสิ่งนี้ไว้ในพรอมต์ของคุณ ผมเชื่อว่ามันโดยรวมทั้งในของคุณ\!PS1
    • หรือดูรายการประวัติของคุณ หากรายการสุดท้ายคือ82 historyคำสั่งถัดไปของคุณคือ 83
  • ลบ 83−77 = 6
  • ประเภท!-6. นี่จะรันคำสั่งอีกครั้ง 77
  • เลือก!-6, คัดลอกและวาง เนื่องจากการเรียกใช้งานคำสั่ง 77 ( ./generator.sh) ใหม่ของคุณเป็นคำสั่ง 83 ตอนนี้คุณอยู่ที่คำสั่ง 84 ดังนั้น!-6จะเรียกใช้คำสั่ง 78 อีกครั้ง
  • ทำซ้ำการวาง!-6ตามที่ต้องการ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.