วิธีการเข้าถึงอาร์กิวเมนต์ที่สองจากคำสั่งสุดท้ายในประวัติศาสตร์?


11

ฉันเริ่มเรียนรู้ Regex บางอย่างดังนั้นฉันใช้คำสั่งนี้ซ้ำ ๆ :

grep pattern /usr/share/dict/american-english 

เฉพาะส่วนที่มีการเปลี่ยนแปลงรูปแบบดังนั้นฉันต้องเขียนนิพจน์แบบยาว " / usr / share / dict / american-english " ซ้ำแล้วซ้ำอีก

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


นี่เป็นเรื่องของอาร์กิวเมนต์ที่สองหรืออาร์กิวเมนต์สุดท้ายหรือไม่
mikeserv

ในกรณีนี้อาร์กิวเมนต์สุดท้ายเกิดขึ้นเป็นครั้งที่สองฉันไม่ได้ทำให้ความแตกต่างนี้ชัดเจน
Abdul Al Hazred

ในกรณีเช่นนั้นbash, dash, zsh, mkshและkshเปลือกหอย(อย่างน้อยที่ฉันรู้เกี่ยวกับ)ทั้งหมดจะรับรู้$_หาเรื่องสุดท้ายพารามิเตอร์พิเศษ(บางคนทำเฉพาะในโหมดโต้ตอบแม้ว่า) grep somepattern filename; grep otherpattern "$_"มันก็ขยายตัวเช่นตัวแปร: setคุณจะสามารถดูเนื้อหาในการส่งออกของ
mikeserv

คำตอบ:


23

คุณสามารถใช้<M-.>(หรือ<Esc>.ถ้าใช้คีย์ Meta ของคุณเพื่อสิ่งอื่น) นั่นคือ Meta-dot (หรือ <esc> dot) โดยที่ Meta มักจะเป็นปุ่ม Alt เพื่อเรียกคืนอาร์กิวเมนต์สุดท้ายของคำสั่งก่อนหน้า ดังนั้นก่อนอื่นคุณต้องพิมพ์

$ grep foo /usr/share/dict/american-english

แล้วถ้าคุณต้องการ grep เพื่อสิ่งอื่นคุณจะต้องพิมพ์

$ grep bar

หลังจากพิมพ์ช่องว่างแล้วEsc.(นั่นคือก่อนอื่นให้กดปุ่ม Escape และจากนั้นกดปุ่มระยะเวลา):

$ grep bar /usr/share/dict/american-english

คุณสามารถใช้วิธีใดวิธีหนึ่งต่อไปนี้:

$ grep bar !:2
$ grep bar !$

โดยที่!:2และ!$หมายถึง "อาร์กิวเมนต์ที่สอง" และ "อาร์กิวเมนต์สุดท้าย" ตามลำดับ


นี่สำหรับ bash และ shells ที่ใช้ readline โดยใช้การผูก emacs (ค่าเริ่มต้น): ด้วยediting-mode viชุดคุณจำเป็นต้องเพิ่มการเชื่อมโยง~/.inputrcสำหรับyank-last-argและสำหรับ Zsh คุณต้องผูกinsert-last-word...
jasonwryan

@jasonwryan ถ้ามันหาเรื่องสุดท้ายที่คุณต้องการแล้วในใด ๆ ของ(interactive) zsh , bash, ksh, mkshหรือเปลือกหอยที่คุณสามารถใช้เพียงdash $_POSIXLY ที่มีผลผูกพันอยู่แล้วตั้ง แต่จะESC _เมื่อset -o viมีผล
mikeserv

@mikeserv ขอบคุณไมค์ฉันจะต้องมีการตอบสนองมันเข้ากันได้ ...
jasonwryan

@ jasonwryan - ไม่มีปัญหา - นี่เพิ่งเกิดขึ้นเป็นเพียงเคล็ดลับแป้นพิมพ์เชลล์เดียวที่ฉันรู้ - ฉันดูดที่จำ / กำหนดค่าทางลัดประเภทรวดเร็วทั้งหมดเหล่านั้น หากคุณไม่คำนึงถึงความเข้ากันได้กับอะไร มีโปรแกรมที่คุณใช้ซึ่งแตกต่างกันบ้างไหม? โอ้ฉันยังจำได้ @letter ESC สำหรับ_letterนามแฝงผูกพัน - แต่เพียงเพราะฉันยังไม่สามารถคิดออกว่าจะทำให้การทำงาน w / editlineBSD
mikeserv

@ ไมค์เซอร์ฉันผูกมันแบบนั้นไม่ว่าฉันจะใช้ Bash หรือ Zsh (ทั้งในโหมด vi) หรือบนเครื่องที่มี Bash ในโหมด Emacs (มันเป็นหนึ่งในการผูกที่ฉันใช้จริงๆ)
jasonwryan

2

โดยทั่วไป (พร้อม Bash) <Esc> N <Esc> .จะเรียกคืนอาร์กิวเมนต์ N'th จากคำสั่งก่อนหน้านี้ในบรรทัดคำสั่งปัจจุบัน (โดยที่ N เป็นฐาน 0)

สำหรับอาร์กิวเมนต์ที่สองจากคำสั่งสุดท้ายนั่นก็คือ:

<Esc> 1 <Esc> .

หากคุณต้องการอาร์กิวเมนต์ที่สามแล้ว

<Esc> 2 <Esc> .

... และต่อไป

ดังที่คนอื่น ๆ พูดถึงถ้าคุณต้องการอาร์กิวเมนต์สุดท้ายจากคำสั่งก่อนหน้ามีทางลัดเฉพาะสำหรับสิ่งนั้นในเวลาเพียง:

<Esc> .

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.