ใน Bash มีโอเปอเรเตอร์ที่ใช้งานง่ายบางส่วนเพื่อทำซ้ำส่วนของคำสั่งสุดท้าย:
!^
ขยายไปยังอาร์กิวเมนต์แรกของคำสั่งก่อนหน้าเช่น$ echo one "two three" one two three $ echo !^ echo one one
!$
ขยายไปยังอาร์กิวเมนต์สุดท้ายของคำสั่งก่อนหน้าเช่น$ echo one "two three" one two three $ echo !$ echo "two three" two three
!*
ขยายไปยังข้อโต้แย้งทั้งหมดของคำสั่งก่อนหน้าเช่น$ echo one "two three" one two three $ echo !* echo one "two three" one two three
(เท่าที่ผมเข้าใจเหล่านี้เป็นน้ำตาลประโยคสำหรับ!!:^
, !!:$
และ!!:*
ตามลำดับซึ่ง!!
เป็นตัวกำหนดเหตุการณ์ที่ขยายคำสั่งก่อนหน้านี้และ^
, $
และ*
มี designators คำให้ดูทุบตี Reference Manualหรือman bash
.)
สิ่งเหล่านี้มักจะมีประโยชน์มาก แต่มันจะยิ่งเย็นขึ้นด้วยแป้นพิมพ์ลัด:
เมื่อคุณกดAlt+ .หรือAlt+ _อาร์กิวเมนต์สุดท้ายของคำสั่งก่อนหน้านี้จะถูกแทรกในคำสั่งปัจจุบันเช่นเดียวกับที่คุณเขียน
!$
ที่จุดนั้นนอกจากนี้ยังเป็นไปได้ที่จะกดAlt+ Ctrl+ yเพื่อแทรกอาร์กิวเมนต์แรกของคำสั่งก่อนหน้าราวกับว่าคุณเขียน
!^
ที่จุดนั้น
(ดูGNU Readline Libraryหรือinfo readline
.)
ฉันมักจะชอบแป้นพิมพ์ลัดมากกว่าตัวดำเนินการประวัติของ Bash เพราะฉันเห็นสิ่งที่ฉันใส่ก่อนที่ฉันจะเรียกใช้คำสั่งจริง อย่างไรก็ตามดูเหมือนว่าจะไม่มีทางลัดที่ทำให้ฉันสามารถแทรกคำทั้งหมดของคำสั่งก่อนหน้านี้ได้เช่นคำที่!*
ทำงานได้ อย่างน้อยฉันก็หามันไม่เจอ
มีทางลัดไหม? ถ้าไม่เป็นไปได้หรือไม่ที่จะกำหนดค่าไลบรารี readline เพื่อเพิ่มหนึ่งรายการและอย่างไร
zsh
หากคุณพิมพ์echo !*
แล้วกด TAB คุณจะมีเอฟเฟกต์ที่ต้องการ โดยทั่วไป TAB ขณะที่อยู่ใน readline จะขยายทั้งหมดที่ขยายได้ มีประโยชน์มาก อาจทุบตีจะมีการกำหนดค่าบางอย่างเพื่อผลเหมือนกัน? @Seth ฉันคิดว่านี่เป็น readline ในการทุบตีไม่ใช่ terminal emulator - ไม่แน่ใจว่า
man bash
(ที่ใดที่บรรทัด 3030)
\e.
และ\e_
ถูกแมปกับฟังก์ชั่นที่ ReadLine yank-last-arg
และถูกแมปไป\e\C-y
yank-nth-arg
น่าเศร้าที่ดูเหมือนว่าจะไม่มีคำสั่ง (เดียว) ที่เพิ่มอาร์กิวเมนต์ก่อนหน้าหลายรายการพร้อมกัน