สมมติว่าฉันต้องการรันคำสั่งสี่คำสั่งที่ฉันได้ดำเนินการมาก่อน หากคนแรกคือ 432 ในประวัติศาสตร์คำสั่งจากนั้นฉันสามารถทำได้:
$ !432; !433; !434; !435
ฉันอยากรู้อยากเห็นมีวิธีที่มีประสิทธิภาพมากขึ้นเพื่อให้บรรลุนี้
สมมติว่าฉันต้องการรันคำสั่งสี่คำสั่งที่ฉันได้ดำเนินการมาก่อน หากคนแรกคือ 432 ในประวัติศาสตร์คำสั่งจากนั้นฉันสามารถทำได้:
$ !432; !433; !434; !435
ฉันอยากรู้อยากเห็นมีวิธีที่มีประสิทธิภาพมากขึ้นเพื่อให้บรรลุนี้
คำตอบ:
ถ้ามันหมายถึงคำสั่งที่เพิ่งรันเมื่อเร็ว ๆ นี้วิธีที่มีประสิทธิภาพมากขึ้นคือการอ้างอิงมันด้วยจำนวนลบ
!-4; !-3; !-2; !-1
!!
นอกจากนี้เมื่อคุณทำมันรายการประวัติศาสตร์ที่ผ่านมาของคุณจะมีห่วงโซ่ทั้งหมดของคำสั่งเพื่อให้คุณสามารถทำซ้ำได้ด้วย
แก้ไข:
หากคุณยังไม่ได้ทำความคุ้นเคยกับฟังก์ชั่นในตัวที่ดีfc
,กล่าวโดยกิลส์ (ใช้help fc
) ปรากฎว่าคุณสามารถใช้ตัวเลขติดลบได้ดังนั้นคุณสามารถทำเช่นเดียวกับการใช้ข้างต้น
eval "`fc -ln -4 -1`"
สิ่งนี้มีหนึ่งข้อแม้แม้ว่า: หลังจากนี้eval
บรรทัดจะถูกเก็บไว้ในประวัติเป็นคำสั่งสุดท้าย ดังนั้นหากคุณเรียกใช้อีกครั้งคุณจะตกหลุม!
วิธีที่ปลอดภัยกว่าในการทำเช่นนี้คือการใช้fc
โหมดการทำงานเริ่มต้น: ส่งต่อคำสั่งที่เลือกไปยังตัวแก้ไขและเรียกใช้เมื่อคุณออกจากมัน ลอง:
fc -4 -1
คุณสามารถย้อนกลับลำดับของช่วงของคำสั่ง: fc -1 -4
ในการดูคำสั่งต่าง ๆ ในประวัติศาสตร์ให้ใช้fc
คำสั่งในตัว:
fc -ln 432 435
หากต้องการดำเนินการอีกครั้ง:
eval "$(fc -ln 432 435)"
man fc
ไม่ให้อะไรฉัน สิ่งที่fc
ยืนหยัดเพื่อ? มีตัวเลือกอื่น ๆ อีกบ้าง?
help fc
... และยังhelp help
.... ช่วยด้วย: help [-dms] [pattern ... ] แสดงข้อมูลเกี่ยวกับคำสั่ง builtin
-l
eval
fc
ย่อมาจาก "พบคำสั่ง" หรือ "แก้ไขคำสั่ง"
มีวิธีที่ดีและเป็นทางเลือกในการรันคำสั่งจำนวนมากตามลำดับจากประวัติ Bash:
แทนที่จะใช้การแทนที่ประวัติ ( !432
หรือ!-4
) คุณสามารถค้นหาประวัติด้วยCtrl+ rและเมื่อคุณพบคำสั่งแรกที่คุณต้องการ เรียกใช้, กดCtrl+ o( ใช้งานและรับถัดไป ) แทนreturnปุ่ม
ซึ่งจะเปิดใช้คำสั่งและเสนอคำสั่งถัดไปจากประวัติ คุณสามารถเข้าชมได้Ctrl+oหลายครั้งตามที่คุณต้องการและจบลำดับด้วยreturnตัวสุดท้ายหรือCtrl+cหยุดโดยไม่เปิดตัว
Ctrl-o
มันก็ outputs ตัวอักษรและแบ่งของฉัน^o
(reverse-i-search)
อาจมีการตั้งค่าอื่น ๆ ที่เกี่ยวข้อง
หากต้องการดำเนินการคำสั่งทันทีแทนที่จะแก้ไขคำสั่งนี่คือคำตอบแบบไจล์ของซิลลีที่มีขนาดเล็กลงโดยใช้ eval :
fc -e: 432 435
อาร์กิวเมนต์โคลอนของ -e คือ bash noop ซึ่งมีผลในการข้ามขั้นตอน "open in a editor" ที่ fc ต้องการ นอกจากนี้ตอนนี้ประวัติ (ล่าสุด) จะมีคำสั่งจริงจากประวัติมากกว่าคำสั่ง eval
fc
สำหรับห่วงและ xsel
สิ่งนี้ใช้ได้ดีเมื่อฉันต้องการเชื่อมและรันคำสั่ง n ล่าสุดซ้ำหลาย ๆ ครั้ง:
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})"
)
แล้ว:
$ 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
หรือสำหรับคำสั่งขนาดใหญ่ที่อาจต้องมีการแก้ไข:
fcn 3 1 >cmds.sh
vi cmds.sh
bash cmds.sh
bash cmds.sh
history -p \!43{2..5}
พิมพ์คำสั่ง 432 ถึง 435 ไปยังเทอร์มินัลได้ซึ่งเหมาะสำหรับการคัดลอก / วางในภายหลัง