ฉันจะรับอาร์กิวเมนต์ที่เฉพาะเจาะจงจากคำสั่งก่อนหน้าในทุบตีได้อย่างไร


31

ใน bash คุณสามารถใช้!*เพื่อรับอาร์กิวเมนต์ทั้งหมดจากคำสั่งก่อนหน้า ตัวอย่างเช่นถ้าคุณทำcp /some/path /some/other/pathแล้วไม่ได้ทำคำสั่งที่สองจะขยายได้ถึงmv !*mv /some/path /some/other/path

มีอะไรเช่นนี้ที่สามารถใช้ในการเข้าถึงอาร์กิวเมนต์ที่เฉพาะเจาะจงจากคำสั่งแทนทั้งหมดหรือไม่

คำตอบ:


38

ใน!*, !คือการขยายตัวของประวัติศาสตร์คำนำหน้าและ*เป็นตัวกำหนดคำที่หมายถึงทุกข้อโต้แย้ง คุณสามารถจดจำไวยากรณ์ทั่วไปเป็น bang-line-colon-column ( คอลัมน์!บรรทัด:) มีทางลัดที่เป็นไปได้มากมาย: บรรทัดเริ่มต้นคือบรรทัดก่อนหน้าตัวระบุคอลัมน์เริ่มต้นคือ“ ทั้งหมด” และคุณสามารถออกจากโคลอนได้หากตัวระบุคอลัมน์ไม่ใช่ตัวเลข (แต่!3หมายถึงบรรทัดที่ 3) คุณสามารถใช้!:0ในการอ้างถึงชื่อคำสั่ง!:1, !:2ฯลฯ ในการอ้างถึงข้อโต้แย้งต่อเนื่อง!:$สำหรับคำที่ผ่านมา!:*สำหรับทุกข้อโต้แย้งและอื่น ๆ

ดูยังโพสต์นี้โดยไมเคิล Mrozekที่ใช้ระบบปฏิบัติการยูนิกซ์ Stack แลกเปลี่ยน


1
ฉันลองด้วยตัวเอง แต่มันก็ใช้ไม่ได้ หลังจากดูโพสต์โดย Michale Mrozek มันก็บอกว่าจะใช้!:1, !:2. หลังจากใช้เวอร์ชันกับโคลอนแล้วก็ใช้งานได้
Wuffers

@MrMan: โอ๊ะโอถ้าคุณไม่ใช้โคลอนด้วยตัวเลขตัวเลขจะถูกตีความเป็นหมายเลขบรรทัด ขอโทษสำหรับเรื่องนั้น.
Gilles 'หยุดความชั่วร้าย'

ไม่มีปัญหา. ดังนั้นฉันคิดว่าการทำ!1:1จะชี้ไปที่อาร์กิวเมนต์แรกของบรรทัดแรก
Wuffers

4

โดยส่วนตัวแล้วฉันไม่ชอบคุณสมบัติ "การขยายด้วยเครื่องหมายอัศเจรีย์" ซึ่งจะรบกวนหากคุณลองใช้echo "Hello World!"เชลล์แบบอินเทอร์แอคทีฟ

ดังนั้นฉันตั้งค่าset +o histexpandและเริ่มการเรียกคืนข้อโต้แย้งด้วยวิธีการต่อไปนี้:

Esc, 1, Esc, Ctrl-Y => Insert first argument of previous command.

โปรดทราบว่า Esc-trick เป็นเพราะฉันไม่มีเมตาคีย์


ฉันแทบไม่เคยใช้เครื่องหมายอัศเจรีย์ในคำสั่ง ดังนั้นวิธีเครื่องหมายอัศเจรีย์จึงทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน
Wuffers

จากนั้นสนุกไปกับมัน คุณสมบัติมากมายของเชลล์ของคุณได้รับการออกแบบมาสำหรับผู้ใช้เพียงไม่กี่คน
เบอนัวต์

ที่จริงแล้วคุณไม่ต้องหลบหนีจากเครื่องหมายอัศเจรีย์ echo 'Hello, orld!'Do หมายเหตุเครื่องหมายคำพูดเดี่ยวแทนที่จะเป็นเครื่องหมายคำพูดคู่
Wuffers
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.