ฉันจะเรียกคืนอาร์กิวเมนต์ของคำสั่ง bash ก่อนหน้าได้อย่างไร


312

มีวิธีใน Bash เพื่อเรียกคืนอาร์กิวเมนต์ของคำสั่งก่อนหน้าหรือไม่?

ฉันมักจะตามมาด้วยvi file.cgcc file.c

มีวิธีใน Bash เพื่อเรียกคืนอาร์กิวเมนต์ของคำสั่งก่อนหน้าหรือไม่?


2
ซ้ำซ้อนที่เป็นไปได้: stackoverflow.com/questions/4009412/…
eugenevd

คำตอบ:


562

คุณสามารถใช้$_หรือ!$เพื่อเรียกคืนอาร์กิวเมนต์สุดท้ายของคำสั่งก่อนหน้า

นอกจากนี้ยังAlt + .สามารถใช้เพื่อเรียกคืนอาร์กิวเมนต์สุดท้ายของคำสั่งก่อนหน้าใด ๆ


121
นอกจากนี้หากคุณต้องการโต้แย้งโดยพลการคุณสามารถใช้!!:1และ!!:2อื่น ๆ ( !!:0เป็นคำสั่งก่อนหน้านี้เอง) ดูgnu.org/software/bash/manual/bashref.html#History-Interaction
janmoesen

41
เช่นเดียวกับที่ !$คุณใช้!^สำหรับอาร์กิวเมนต์แรก
จะ

13
อ่า ... * ระวัง ... คุณคือสิ่งที่สวยงาม ... ทุกวันฉันรักคุณมากขึ้น
jx12345

เราจะอ้างถึงอาร์กิวเมนต์ที่สองถึงอาร์กิวเมนต์สุดท้ายของคำสั่งก่อนหน้าได้อย่างไร ตัวอย่างเช่นถ้าฉันให้echo tiger rabbitฉันจะดูtigerคำสั่งต่อไปนี้ได้อย่างไร
Chan Kim

3
Alt + .ไม่ทำงานในโหมด vi แค่ FYI สำหรับคนอื่นที่สับสนที่นี่
Brian McCutchon

160

หากคำสั่งก่อนหน้ามีสองข้อโต้แย้งเช่นนี้

ls a.txt b.txt

และคุณต้องการอันแรกคุณสามารถพิมพ์ได้

!:1

ให้

a.txt

หรือถ้าคุณต้องการทั้งสองคุณสามารถพิมพ์

!:1-2

ให้

a.txt b.txt

คุณสามารถขยายสิ่งนี้เป็นอาร์กิวเมนต์จำนวนเท่าใดก็ได้เช่น:

!:10-12

@RNA ฉันเพิ่งลองอีกครั้งเพื่อให้แน่ใจว่าฉันไม่ได้พิมพ์ผิดคุณสามารถให้รายละเอียดเพิ่มเติมเล็กน้อย (เช่น ubuntu บรรทัดคำสั่ง cygwin สำหรับ windows ข้อผิดพลาดหรือไม่บรรทัดก่อนหน้า?)
Robert Gowland

ฉันใช้ GNU ทุบตีรุ่น 3.2.51 (1) - ปล่อย (x86_64-apple-darwin13) ลิขสิทธิ์ (C) มูลนิธิซอฟต์แวร์เสรี 2007, Inc. ข้อความแสดงข้อผิดพลาดคือ-bash: :1-2: bad word specifier
RNA

2
ฉันได้สิ่งเดียวกันถ้าไม่มีข้อโต้แย้งสองข้อในบรรทัดก่อนหน้า เช่น. บรรทัด 1 ls a.txtบรรทัด 2ll !:1-2
Robert Gowland

คุณถูก. นั่นเป็นความผิดพลาดที่ฉันทำ ขอบคุณ!
RNA

นอกจากนี้เพื่อให้ได้ข้อโต้แย้งทั้งหมด!:^-$สามารถใช้หรือรหัสที่คล้ายกันของหลักสูตรร่วมกับตัวเลข
816-8055

88

!!:nโดยที่n0 คือตำแหน่งของอาร์กิวเมนต์ที่คุณต้องการ

ตัวอย่างเช่น:

echo 'one' 'two'
# "one two"

echo !!:2
# "two"

!คำนำหน้าจะใช้ในการเข้าถึงคำสั่งก่อนหน้านี้

คำสั่งที่มีประโยชน์อื่น ๆ :

  • !$ - อาร์กิวเมนต์สุดท้ายจากคำสั่งก่อนหน้า
  • !^ - อาร์กิวเมนต์แรก (หลังจากโปรแกรม / built-in / script) จากคำสั่งก่อนหน้า
  • !! - คำสั่งก่อนหน้า (มักออกเสียง "ปังปัง")
  • !n- หมายเลขคำสั่งnจากhistory
  • !pattern - การจับคู่คำสั่งล่าสุด pattern
  • !!:s/find/replace- คำสั่งสุดท้ายแทนที่findด้วยreplace

ข้อมูลเพิ่มเติมเกี่ยวกับประวัติคำสั่ง


7
แทนที่จะคุณยังสามารถ!!:s/find/replace ^find^replace
Big McLargeHuge

นอกจากนี้: !* - อาร์กิวเมนต์ทั้งหมดจากคำสั่งก่อนหน้า (หลังจากโปรแกรม / built-in / script) เช่น: ls *.tmp *.cache rm !*
Aphoid

68

ในบรรทัดคำสั่งคุณสามารถกดesc- .หรือalt+.

มันวนรอบอาร์กิวเมนต์สุดท้ายของคำสั่งก่อนหน้าของคุณ


ฉันได้พบเสมอและปุ่มเพื่อทำงานเช่นกัน
ถัง

ปุ่ม @Bucket ดำเนินการตามคำสั่งก่อนหน้าในขณะที่โซลูชั่นของ Antonio ให้การใช้งานอาร์กิวเมนต์ก่อนหน้า (อาร์กิวเมนต์สุดท้ายของแต่ละคำสั่งก่อนหน้าเท่านั้น)
everyonesdesign

30

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

ใช้การติดตามเพื่อรับอาร์กิวเมนต์ที่สองจากคำสั่งที่สามในประวัติ

!3:2

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

!-5:3

การใช้เครื่องหมายลบคุณขอให้มันสำรวจจากคำสั่งสุดท้ายของประวัติ


19

! * รันคำสั่งใหม่พร้อมด้วยอาร์กิวเมนต์ก่อนหน้าทั้งหมด

ls /tmp
cd !*
#you are now in /tmp

สิ่งนี้ไม่ได้ผลสำหรับฉันใน OSX - ต้องใช้$_แทน
Mike W

16

ใช่คุณสามารถใช้!$เพื่อเรียกคืนอาร์กิวเมนต์สุดท้ายของคำสั่งก่อนหน้า


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