ด้วย BASH หลังจาก“ เลื่อน” ขึ้นไปยังคำสั่งก่อนหน้า…จะเลื่อนไปยังขั้นถัดไปในประวัติศาสตร์นี้ได้อย่างไร?


59

ขออภัยชื่อนี้ไม่ได้หรูหราที่สุดที่ฉันเคยคิด

แต่ฉันคิดว่าผู้คนจำนวนมากจะสงสัยในสิ่งนี้และคำถามของฉันอาจจะเป็นคนหลอกลวง ... ทั้งหมดที่ฉันสามารถพูดได้คือฉันไม่ได้พบมัน

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

ดังนั้นคุณจะพบคำสั่งที่อาจ 30 คำสั่งกลับมา ... และคุณเรียกใช้ และจากนั้นคุณต้องการเรียกใช้คำสั่งที่มาหลังจากนั้น ... มีวิธีที่รวดเร็วในการทำเช่นนี้หรือ หรือคนที่พูดภาษา BASH คล่องแคล่วทำเช่นนี้ได้อย่างไร?

คำตอบ:


96

การรันคำสั่งด้วยCtrl+ oแทนEnterจะเรียกใช้คำสั่งจากประวัติแล้วจัดคิวคำสั่งถัดไปแทนที่จะกลับไปที่ด้านหน้าของประวัติทุบตี


2
ฉันเพิ่งลองทำสิ่งนี้ใน bash ของฉันเองที่ทำงานใน xterm บน NetBSD และมันไม่ทำงาน! มีการตั้งค่าที่มีผลต่อสิ่งนี้หรือไม่? ฉันไม่มีไฟล์. inputc Co ไม่ได้กล่าวถึงในหน้าคู่มือสำหรับ readline (3)
Rhialto

@Rhialto คุณใช้viการแก้ไขบรรทัด (เปิดใช้งานด้วยset -o vi) หรือemacs? เพราะCtrl-Oจะไม่ทำงานกับอดีตเท่าที่ฉันสามารถบอกได้
B Layer

... แต่นี้สามารถแก้ด้วยคำสั่ง: bind "\C-o":operate-and-get-next(หรือเพิ่มทุกอย่างหลังจากbindไป~/.inputrc)
B ชั้น

1
ฉันพบว่าปัญหาของฉันคืออะไร: ^ O ถูกนำมาใช้เป็นอักขระฟลัชเอาท์พุท (ไม่รองรับบน Linux) และ readline จะไม่ปิดการใช้งานในขณะที่มันยังทำงานอยู่ ฉันให้ patch ง่ายๆ แต่ผู้ดูแลระบบ bash และ readline ยืนยันว่านี่ไม่ใช่ข้อผิดพลาด ฉันไม่เห็นด้วย. ดูlists.gnu.org/archive/html/bug-readline/2018-01/msg00004.html
Rhialto

19

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

Bash มีคำสั่งfcซึ่งใช้เป็นหมายเลขบรรทัดพารามิเตอร์ของรายการ bash history จากนั้นจะเปิดตัวแก้ไขเริ่มต้นของคุณด้วยบรรทัดเหล่านั้นเป็นข้อความ ณ จุดนั้นคุณสามารถเลือกที่จะแก้ไขบรรทัด จากนั้นเมื่อคุณออกจากตัวแก้ไขทุบตีรันบรรทัดเหล่านั้น!

ตัวอย่างของการแก้ไขที่คุณอาจต้องการทำคือต่อท้าย แต่บางบรรทัดสุดท้ายเช่น "; read -p" next ... "ซึ่งจะทำให้ bash รันแต่ละบรรทัดและแจ้งให้คุณดำเนินการต่อ

ความคิดเห็นสำหรับ Jon Reinhold: คำตอบที่ดี แต่คุณควรมีคุณสมบัติเพราะถ้าผู้ใช้ตั้งค่าตัวแปร bash HISTCONTROL ให้รวม erasedupsแล้วหลังจากดำเนินการC-oกับผู้ใช้จะสับสนเพราะแทนที่จะเป็นคำสั่งถัดไปที่คาดไว้ในประวัติที่ถูกแสดง จะปรากฏขึ้น นี่เป็นเพราะทุบตีได้ลบอินสแตนซ์ดั้งเดิมของคำสั่งที่ดำเนินการและทำให้คำสั่งทั้งหมดหลังจากนั้นเลื่อนขึ้นหนึ่งบรรทัดคือ ไปที่หมายเลขดัชนีต่ำกว่าหนึ่งในรายการประวัติ


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

3
@mikerodent ฉบับดังนั้นมันเกิดขึ้นfcถือกำเนิดทั้งสองCtl-oและbashตัวเอง (ตรงกันข้ามกับคำตอบนี้มันยังมีประโยชน์น้อย.)
kubanczyk

1
ปัญหาที่เกิดขึ้นกับerasedupsข้อผิดพลาดอย่างชัดเจน ( อาจมีการเตรียมการสำหรับสถานการณ์นี้) ดีที่จะรู้ว่า
alexis

2
@kancanczyk ขึ้นอยู่กับการอภิปราย ถ้ามันเป็นคำสั่งที่ซับซ้อนและซับซ้อนขึ้นอยู่กับสิ่งที่ต้องการแก้ไขมันจะเร็วกว่าที่ฉันจะใช้เครื่องมือแก้ไขตัวเลือกเพื่ออัพเดตคำสั่ง มันก็จะง่ายขึ้น
Pryftan

14

อีกวิธีหนึ่งในการทำให้พฤติกรรมที่คุณต้องการประสบความสำเร็จคือการทำความคุ้นเคยกับทางลัด bash readline (ซึ่งCTRL- oคือสิ่งที่ฉันเชื่อ) และการค้นหาประวัติทุบตี

ค้นหาประวัติ

CTRL- rนำคุณไปสู่การค้นหาประวัติคำสั่ง bash ซึ่งคุณสามารถเริ่มพิมพ์คำสั่งที่คุณกำลังค้นหาและ bash จะเติมคำสั่งให้คุณโดยอัตโนมัติ ฟังก์ชั่นเติมข้อความอัตโนมัตินั้นค่อนข้างดีจริงๆ เมื่อคำสั่งที่คุณต้องการเรียกใช้อยู่บนบรรทัดอินพุตคุณสามารถENTERเรียกใช้คำสั่งหรือกดCTRL- eเพื่อเลื่อนเคอร์เซอร์ไปที่ท้ายบรรทัดคำสั่งและออกจากโหมดการค้นหาประวัติ

สิ่งที่ยอดเยี่ยมด้วยCTRL- eณ จุดนี้คือบัฟเฟอร์ประวัติถูกตั้งค่าตามบริบทของคำสั่งนี้ คำสั่งถัดไปและก่อนหน้าตอนนี้เป็นคำสั่งที่รันก่อนและหลังบรรทัดที่ค้นหาประวัติที่อยู่สำหรับคุณ คุณสามารถกดลูกศรขึ้นหรือลงและคว้าคำสั่งถัดไป

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

ทางลัดสั้นของ Readline

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

  1. CTRL- nสำหรับคำสั่งถัดไป (เทียบเท่าลูกศรลง)
  2. CTRL- pสำหรับคำสั่งก่อนหน้า (เทียบเท่าลูกศรขึ้น)
  3. CTRL- bสำรองอักขระ (เทียบเท่าลูกศรซ้าย)
  4. CTRL- fส่งต่อตัวละคร (เทียบเท่าลูกศรขวา)

ทางลัด readline เหล่านี้ (พร้อมกับCTRL- aจุดเริ่มต้นของบรรทัดและCTRL- eจุดสิ้นสุดของบรรทัด) จะเพิ่มความเร็วและประสิทธิภาพของคุณที่บรรทัดคำสั่ง imo


2
ฉันไม่รู้ ฉันพบว่าการใช้ปุ่มตัวแก้ไขจะช้ากว่าลูกศรหรือการกดปุ่มเดี่ยวอื่น ๆ สำหรับ EOL / etc ฉันมักจะใช้ปุ่ม home / end (stty -a แสดงสิ่งที่มีประโยชน์บางอย่างเช่นกัน)
Pryftan

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

1
@datUser Tbh ​​ฉันพลาด 'imo' (หรือถ้าฉันไม่ได้ละเลยที่จะพิจารณามัน - เป็นไปได้ทั้งหมด) สิ่งที่เป็นจริงแม้ว่าการค้นหาแบบย้อนกลับจะมีประโยชน์ (มี +1) หากเหมาะกับคุณ แน่นอน fc ยังเป็นสิ่งที่ (ตามที่ระบุไว้แล้ว) และเพื่อใช้! (อื่น ๆ ) มีหลายวิธีในการสกินแมวใน Unices สำหรับแป้นพิมพ์ที่ค่อนข้างเป็นจริงเช่นกันฉันมีแป้นพิมพ์ Unicomp (รักและนำความทรงจำกลับมา) แต่แน่นอนว่ายังมีแป้นพิมพ์อื่น ๆ ที่ไม่ต้องพูดถึง Dvorak ในที่สุดตัวเลือกเพิ่มเติมที่คุณมีดีกว่าที่คุณปิดและการทำงานของคุณได้ง่ายขึ้น (หรือเล่น) คือ :)
244 Pryftan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.