จะวนรอบผ่าน reverse-i-search ใน BASH อย่างไร


443

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

คำตอบ:


596

Ctrl+Rถ้าผมเข้าใจคำถามถูกต้องคุณควรจะสามารถวงจรผ่านทางเลือกด้วยซ้ำกดปุ่ม

เช่น:

Ctrl+R grep Ctrl+R Ctrl+R ...

ที่ค้นหาย้อนหลังผ่านประวัติศาสตร์ของคุณ หากต้องการค้นหาไปข้างหน้าแทนการใช้งานCtrl+Sแต่คุณอาจจะต้องมีการตั้ง: stty -ixon(ทั้งโดย.bash_profileหรือด้วยตนเอง) ก่อนที่จะปิดใช้งานคุณลักษณะ XON / XOFF Ctrl+sซึ่งจะใช้เวลามากกว่า (รายละเอียดเพิ่มเติมได้ที่นี่ )


23
+1 - FYI - คุณสามารถค้นหาไปข้างหน้าตามคำตอบ StackOverflowนี้
Jordan Arseno

7
และใช้ Ctrl + Shift + r เพื่อเลื่อนย้อนกลับถ้าคุณบังเอิญผ่าน
Wiswit

19
@wiswit CTRL+SHIFT+rใช้งานไม่ได้สำหรับฉัน
Maxim Suslov

9
@MaximSuslov ดูคำถามนี้: stackoverflow.com/questions/791765/ ...... คุณสามารถเพิ่ม. [[ $- == *i* ]] && stty -ixonbashrc ของคุณแล้วCTRL+sจะทำงานเป็นด้านหลังของCTRL+r
gla3dr

9
@JordanArseno ฉันเอา "ค้นหาไปข้างหน้า" เพื่อหมายถึง "ค้นหาคำสั่งที่ฉันยังไม่ได้พิมพ์"
Josh Johnson

234

หากคุณรู้สึกว่าคำสั่งจะถูกใช้บ่อยคุณสามารถเพิ่มแท็กได้

คำสั่ง #useful

แล้วก็

ctrl+r #useful

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


5
ปกติฉันจะชอบแท็กประเภทนี้ #trg_bld #open_log
Makesh

1
จะเพิ่มแท็กนี้ได้ที่ไหน
Sudip Bhandari

5
@SudipBhandari หลังจากคำสั่งของคุณ # เริ่มความคิดเห็น เช่น ls -lah #useful
Andrei

47

คุณยังสามารถตั้งค่าลูกศรขึ้นและลงเพื่อทำการค้นหาที่แตกต่างกันเล็กน้อยโดยเพิ่มบรรทัดเหล่านี้ใน ~ / .inputrc:

"\e[A": history-search-backward
"\e[B": history-search-forward

แทนที่จะค้นหาสตริงย่อยที่ใดก็ได้ในคำสั่ง (เช่นCtrl-r ) จะค้นหาคำสั่งเริ่มต้นด้วยข้อความทางด้านซ้ายของเคอร์เซอร์ ตัวอย่างเช่นถ้าฉันใช้คำสั่งเหล่านี้:

$ ls bart
$ ls fools

จากนั้นพิมพ์lsและกดUpสองครั้งมันจะแสดงls bartและเคอร์เซอร์ในตำแหน่งเดียวกัน เปรียบเทียบกับCtrl- rซึ่งจะหาlsสองครั้งในบรรทัดสุดท้ายดังนั้นคุณต้องกดอีกครั้งเพื่อค้นหาบรรทัดก่อนหน้า

วิธีการทั้งสองนี้มีจุดแข็งและทั้งสองวิธีสามารถประหยัดเวลาได้มาก


2
นี่เป็นมาตรฐานสำหรับ OS X ดังนั้นคุณไม่จำเป็นต้องสร้าง~/.inputrcและเพิ่มสองบรรทัดเหล่านั้น
DASKAjA

1
ในฐานะที่เป็น falconepi ได้เขียนไว้ในความคิดเห็นของคำตอบนี้บน Ubuntu คุณเพียงแค่ต้องไม่แสดงความคิดเห็นใน~/.inputrcสองบรรทัดรวมถึง history-search- *
Arpad Horvath

คุณสามารถดูโพสต์นี้สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับคำตอบนี้: codeinthehole.com/writing/…
Andrei

นี่ไม่ใช่มาตรฐานสำหรับ macOS ของฉัน (10.13) ฉันพลาดฟังก์ชั่นนี้เสมอ!
comerin

สิ่งที่ดีเกี่ยวกับเรื่องนี้คือคุณยังคงสามารถใช้ ctrl-p / ctrl-n สำหรับการอ่านผ่านประวัติการอ่านเป็นประจำ
elig

0

มีการเปลี่ยนในตัวเป็นCtrl + Rเรียกว่าhstr อนุญาตให้ค้นหาประวัติคำสั่งที่ตรงกับโทเค็นการค้นหาทั้งหมดในเวลาเดียวกัน (เหนือสิ่งอื่นใด) และวนรอบผลลัพธ์โดยใช้ปุ่มลูกศร:

ตัวอย่าง

นี่เป็นscreencast สาธิต

มันสามารถติดตั้งบนระบบปฏิบัติการ Debian-family เช่น:

add-apt-repository ppa:ultradvorka/ppa
apt-get update
apt-get install hstr

hstr --show-configuration >> ~/.bashrc

จากนั้นใช้Ctrl + R(หลังจากเปิดเครื่องอีกครั้ง)

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