ทำความเข้าใจกับเครื่องหมายอัศเจรีย์ (!) ในทุบตี


108

ฉันใช้

history | less

เพื่อรับบรรทัดคำสั่งก่อนหน้าและจากตัวเลขทางด้านซ้ายมือฉันพบบรรทัดที่ต้องการซ้ำ (เช่น 22) และทำ

!22

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


6
คำตอบนี้อาจช่วยได้
Michael Mrozek

9
ไม่ใช่คำตอบสำหรับคำถามของคุณ แต่ <ctrl> + R จะช่วยให้คุณค้นหาประวัติการโต้ตอบของคุณและดำเนินการทันทีหากคุณพบสิ่งที่คุณกำลังมองหา
kasterma

คำตอบ:


144

!เป็นคุณสมบัติที่ แต่เดิมปรากฏในC เชลล์ย้อนกลับไปในวันก่อนที่คุณจะสามารถพึ่งพาเทอร์มินัลเพื่อมีปุ่มลูกศร มีประโยชน์อย่างยิ่งหากคุณเพิ่มหมายเลขคำสั่งปัจจุบันลงในพรอมต์ ( PS1="\!$ ") เพื่อให้คุณสามารถดูหน้าจอของคุณอย่างรวดเร็วเพื่อรับหมายเลขคำสั่งที่ผ่านมา

ตอนนี้คุณสามารถใช้ปุ่มลูกศรและสิ่งต่าง ๆ ที่ต้องการCtrl-Rค้นหาประวัติคำสั่งฉันไม่เห็นการใช้งานคุณลักษณะนี้มากนัก

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

ตัวอย่าง: ข้อผิดพลาดนำร่องทั่วไปในsudoระบบพื้นฐานคือการลืมsudoคำนำหน้าคำสั่งที่ต้องใช้สิทธิ์พิเศษ สามเณรพิมพ์คำสั่งทั้งหมดซ้ำอีกครั้ง นักเรียนขยันแก้ไขคำสั่งจากประวัติคำสั่งของเชลล์ sudo !!พุทธะชนิดหนึ่ง

ทุบตีช่วยให้คุณสามารถปิดการใช้งาน!การประมวลผลในเปลือกด้วยหรือset +o histexpand set +Hคุณสามารถปิดการใช้งานใน zsh set -Kกับ


4
ฉันพบว่า Ctrl-P Ctrl-J นั้นค่อนข้างเร็ว เร็วกว่า Up Enter อย่างน้อย
ephemient

24
หากคุณเพียงแค่ต้องการที่จะเรียกใช้คำสั่งที่ผ่านมาขึ้น / ใส่เป็นได้ แต่ถ้าคุณต้องการที่จะเพิ่มไปในทางใดทางหนึ่ง (พูด, คุณลืมsudoหรือบางสิ่งบางอย่าง) จากนั้นคุณสามารถทำsudo !!เช่น อาจเร็วกว่า "Up / Ctrl-A (หรือ Home หากคุณโชคดีพอ) / sudo / space / enter" YMMV :)

1
@ AquariusPower: เพียงแค่พูดมัน อย่างใดอย่างหนึ่งecho 'Hi!'หรือหรือecho "Hi!" echo Hi\!ทั้งหมดทำในสิ่งเดียวกัน
Warren Young

1
setopt NO_BANG_HISTใน zsh -Kอาจจะเป็นที่น่าจดจำมากกว่า
กอรี่

48

หากไม่มีคำตอบอีกต่อไปที่นี่จะมีหนึ่งในผู้ใช้ระดับสูงอย่างแน่นอนเนื่องจากฉันเพิ่งอ่านหนึ่งเมื่อเร็ว ๆ นี้ ในหน้าbash manคุณสามารถค้นหาหัวข้อใหญ่ ๆเกี่ยวกับการขยายประวัติศาสตร์ในเรื่องนี้ได้

คุณสามารถทำพื้นที่ทั้งหมดมากกว่าเพียงแค่เรียกใช้คำสั่งที่ผ่านมาหรือหมายเลขคำสั่ง X. คุณสามารถทำสิ่งที่ชอบที่จะเรียกใช้คำสั่งสุดท้ายที่เริ่มต้นด้วย!cat catหรือ!?bash?:s/bash/csh/รันคำสั่งสุดท้ายที่มีแต่แทนที่มันด้วยbashcsh


3
แม้ว่าจะไม่ใช่คำตอบสำหรับคำถามของ OP โดยตรง แต่วิธีนี้ต้องการวิธี upvotes มากกว่า มีประโยชน์มาก! ขอบคุณ Havok
malvim

เอ่อฉันควรมองเข้าไปในหน้าคนก่อนที่จะเริ่ม googling
erikbwork

1
!!:s/bash/csh/ใช้คำสั่งสุดท้ายจริง ๆแล้วแทนที่ bash ด้วย csh ถ้ามี ไม่ใช่คำสั่งสุดท้ายที่มีการทุบตี ที่จะเป็น!?bash?:s/bash/csh/หรืออาจจะ!?bash?:s/%/csh/
CDE

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

39

สามารถทำได้!หลายอย่างเช่น:

  • รันคำสั่งที่พิมพ์ก่อน 3 คำสั่ง: !-3
  • รันคำสั่งที่ขึ้นต้นด้วย !ls

และอีกมากมาย ดูตัวอย่างการขยายประวัติ Linux Bash 15 ตัวอย่างที่คุณควรทราบ


โหวตขึ้นสิ่งนี้ ไม่มีคำตอบอื่นใดที่มีเคล็ดลับอันชาญฉลาดเหล่านี้
Gergely Lukacsy

เพิ่มขึ้นเพราะ www.thegeekstuff.com เป็นเพียงแหล่งข้อมูลที่ยอดเยี่ยมและนี่เป็นหนึ่งในไม่กี่ลินุกซ์ที่ฉันไม่เคยเห็นมาก่อน มีประโยชน์มาก
Steve Benner

4

เพื่อนคนหนึ่งของฉันส่งอีเมลฉัน:

มันเป็นส่วนหนึ่งของห้องสมุดประวัติศาสตร์ของ GNU ใน bash มันถูกใช้เพื่อรันคำสั่งอีกครั้งในประวัติของคุณ หากคุณต้องการเป็นฮาร์ดคอร์ให้ grep สำหรับ history_expansion_char ใน bash-4.1 / lib / readline / histexpand.c สำหรับรายละเอียดการใช้งาน


3

แน่นอนคุณสามารถ!!ใช้คำสั่งสุดท้ายใน bash shell ได้ แล้วมี!$การนำส่วนสุดท้ายของคำสั่งสุดท้ายของคุณกลับมาใช้ใหม่

เช่นดูไฟล์บางไฟล์

less path/to/your/file.txt

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

vim !$

1
ฉันหวังว่าจะพบสิ่งนี้ มันทำงานอย่างไรกับสองอาร์ค?
Jonathan

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