ใส่คำสั่ง history ลงบนบรรทัดคำสั่งโดยไม่ต้องดำเนินการ


57

ฉันใช้! n โดยที่ (n) คือหมายเลขบรรทัดสำหรับการดำเนินการบรรทัดในไฟล์ประวัติที่ฉันต้องการดำเนินการที่พรอมต์คำสั่งที่ฉันค้นหาผ่าน history | less

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

ที่ดีที่สุด

คำตอบ:


71

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

หากคุณมีชุดhistverify ตัวเลือก ( shopt -s histverify) คุณจะมีโอกาสแก้ไขผลลัพธ์ของการทดแทนประวัติได้เสมอ

fcในตัวช่วยให้การเข้าถึงที่ จำกัด การขยายตัวของประวัติศาสตร์ (ไม่ designators คำ) และช่วยให้คุณแก้ไขคำสั่งก่อนหน้านี้ในบรรณาธิการภายนอก

คุณสามารถใช้!prefixในการอ้างถึงคำสั่งสุดท้ายเริ่มต้นด้วยprefixและในการอ้างถึงคำสั่งสุดท้ายที่ขึ้นต้นด้วย!?substring substringเมื่อคุณรู้ว่าสิ่งที่คุณกำลังมองหานี้สามารถประหยัดเวลาhistory | lessได้มาก

อีกวิธีหนึ่งในการค้นหาจากประวัติก่อนหน้าคือการค้นหาแบบเพิ่มหน่วย: กดCtrl+ Rและเริ่มป้อนสตริงย่อยของสิ่งที่คุณต้องการ กดCtrl+ Rเพื่อไปยังการค้นหาก่อนหน้าของสตริงการค้นหาจนถึงCtrl+ และSถ้าคุณไปไกลเกินไป ปุ่มอื่น ๆ ส่วนใหญ่กว่าCtrl+ R, Ctrl+ S, Backspaceและตัวอักษรธรรมดายุติการค้นหาที่เพิ่มขึ้นและมีผลกระทบปกติของพวกเขา (เช่นปุ่มลูกศรเพื่อเลื่อนเคอร์เซอร์ในบรรทัดที่คุณถึงEnterจะเรียกใช้คำสั่ง)


มีการพิมพ์ผิดในตัวอย่างแรกของคุณคือ ...
pbm

9
คุณจะต้องทำstty -ixonก่อนที่ Ctrl-s จะทำงาน
Dennis Williamson

@Dennis: ว้าวเทอร์มินัลอีมูเลเตอร์สมัยใหม่จะไม่ทำสิ่งนี้โดยปริยาย <การทดสอบ> ถูกต้องแม้กระทั่ง gnome-terminal ใน Ubuntu ก็มีระบบควบคุมการไหล!
Gilles 'หยุดความชั่วร้าย'

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

@ จุดเดนนิสเกี่ยวกับการCtrl-sเป็นสิ่งที่สำคัญเป็นอย่างอื่นอย่างใดอย่างหนึ่งได้รับการติดเป็นที่ฉันทำ
imz - Ivan Zakharyaschev

15

อีกอันเล็ก: Alt+#

ใส่เครื่องหมายคอมเม้นต์บรรทัดปัจจุบันและย้ายลงในบัฟเฟอร์ประวัติ

ดังนั้นเมื่อคุณกำลังรวบรวมบรรทัดคำสั่งและคุณจำเป็นต้องออกคำสั่งระหว่างกาลเพื่อหาไฟล์คุณเพียงกดAlt+ #ออกคำสั่งอื่น ๆ ขึ้นไปในประวัติศาสตร์ไม่แสดงข้อคิดเห็นและดำเนินการต่อ


2
นอกจากนี้ยังEsc, #ทำงาน
สตีเว่นขี้

และคุณสามารถพิมพ์ลงบน mac (กด shift ค้างไว้, กด ESC และ # ร่วมกัน), ไม่เหมือนกับ ket combo อื่น ๆ (fn + alt + shift + #) ;-)
0xF2

7

คุณสามารถใช้พื้นที่เวทย์มนตร์เพื่อขยายประวัติก่อนกดปุ่ม Enter ใน. inputrc ของคุณให้แม็ปพื้นที่ไปยังพื้นที่เวทย์มนตร์:

$if Bash
     Space: magic-space
$endif

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



4

การใช้Ctrl+rคุณสามารถค้นหาประวัติ:

pbm@tauri ~ $ 
(reverse-i-search)`xran': xrandr -o normal

คำสั่งใด ๆ ที่คุณพบสามารถแก้ไขได้ ...


ฉันคิดว่าฉันพบสิ่งที่คุณต้องการ: เรียกใช้shopt -s histverifyและครั้งต่อไปเมื่อคุณต้องการใช้!nคำสั่งจะไม่ถูกดำเนินการ แต่ใส่ในบรรทัดคำสั่งเท่านั้น ...


คุณต้องดำเนินการคำสั่งก่อนที่จะสามารถค้นหาด้วย Ctrl + r ไม่ใช่สิ่งที่ Vass ขอ
phunehehe

1
ฉันไม่เข้าใจว่าสิ่งนี้ไม่ได้ทำในสิ่งที่เขาถาม ฉันจะเพิ่มว่าถ้าคุณต้องการแก้ไขคำสั่งก่อนเรียกใช้คุณสามารถกด TAB ได้เมื่อคุณพบคำสั่งที่ถูกต้อง
Steven D

2
ดังนั้นขั้นตอนจะเป็น (1) Ctrl + r, (2) พิมพ์จนกว่าคุณจะพบคำสั่ง (3) TAB, (4) คำสั่งแก้ไข (5) ENTER
Steven D

1
@phuenhehe: "แต่มีคำสั่งเป็นเหตุการณ์ประวัติศาสตร์บรรทัดฉันต้องการที่จะแก้ไขด้วยตนเอง"
PBM

1
จะไม่!n:pทำงานเหรอ
alex

1

ฉันมักจะต้องการสิ่งนี้ เมื่อฉันใช้ csh (และ tcsh) ฉันมีสำนวน:
!:88*:p

สำนวนนี้จะแทรก "word 88 ถึงคำสุดท้าย" ของคำสั่งก่อนหน้า ณ จุดที่คุณกำลังพิมพ์บนบรรทัดคำสั่งปัจจุบันซึ่งโดยทั่วไปแล้วจะเป็นจุดสิ้นสุด ใน csh ไม่ใช่ข้อผิดพลาดสำหรับนิพจน์ดังกล่าวที่จะไม่สร้างคำใด ๆ นั่นคือไม่จำเป็นต้องมีคำว่า 88 หรือสิ่งที่ตามมา หากไม่มีคำใด ๆ 88 คำนี้จะไม่เพิ่มคำใด ๆ ลงในส่วนท้ายของคำสั่งที่พิมพ์และจากนั้นดันบรรทัดคำสั่งผลลัพธ์ลงในประวัติโดยไม่ต้องดำเนินการ

อย่างที่คุณรู้
*! (เช่น !! และ! -1) เป็นคำสั่งก่อนหน้า;
*: 88 คือคำ 88 (คำแรก - โดยทั่วไปคำสั่ง - เป็นศูนย์) และ csh จะต้องการคำดังกล่าวอยู่ แต่ ...
*: 88 * เป็นคำทั้งหมดที่เริ่มต้นที่คำว่า 88 และจากนั้น csh จะทำ ไม่ต้องการคำที่มีอยู่;
*: p หมายถึงพิมพ์ แต่ไม่เรียกใช้งานบรรทัดคำสั่ง
ด้วยหรือไม่มี: p บรรทัดคำสั่งจะถูกเพิ่มเข้าไปในประวัติคำสั่ง

"ทำไมต้อง 88?" คุณสงสัย? เพราะมันเป็นรหัสเดียวกับ * ฉันต้องการ หากคุณมีคำสั่งที่ยาวบางที!: 888 *: p คือสิ่งที่คุณต้องการ ขออภัยนี่ไม่สามารถใช้ได้กับการทุบตี AFAIK ทุบตีเพียงจะพูด bash: :88*: bad word specifier

สนุกจริง: โดยปกติแล้วคำสั่งของคุณไม่จำเป็นต้องเป็นอันดับแรก
> /tmp/foo echo My command is word 3
ใช้ได้ใน bash และ csh


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

0

ปกติฉันใช้Ctrl+ rเพื่อค้นหาและจากนั้นCtrl+ eเพื่อไปยังจุดสิ้นสุดของบรรทัดโดยไม่ต้องดำเนินการ



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