วิธีที่ดีที่สุดในการค้นหาประวัติของเชลล์


78

มีวิธีที่ดีกว่าในการค้นหาไฟล์ประวัติสำหรับคำสั่งมากกว่า grep หรือไม่? ฉันมีความคิดบางอย่างว่าคำสั่งเริ่มต้นอย่างไร แต่ฉันไม่รู้ว่ามันจะย้อนกลับไปนานแค่ไหนในประวัติศาสตร์

อัปเดต:ก่อนหน้านี้มีเฉพาะ zsh แต่เนื่องจากคำตอบที่ทับซ้อนกันคุณสามารถตอบเชลล์ (หรือโหมด (vi / emacs)) ใด ๆ ได้ที่นี่โปรดทราบว่ามันเฉพาะเจาะจงหรือไม่

คำตอบ:


73

Ctrl+ Rโดยปกติจะเป็นวิธีที่ดีที่สุดในขณะที่บ่งบอกว่า นอกจากนี้คุณยังสามารถใช้!stringซึ่งไหลคำสั่งล่าสุดที่เริ่มต้นด้วยstringหรือซึ่งไหลคำสั่งล่าสุดที่ประกอบด้วย!?string?string

(ฉันคิดว่ามันเป็นสิ่งเดียวที่เกี่ยวข้องกับคำถามนี้ แต่ฉันครอบคลุมคำสั่งประวัติมากขึ้นในคำตอบนี้ )


4
คุณทำให้ 'ctrl + r' เป็นแบบนั้นได้อย่างไร
xenoterracide


ฉันไม่ทราบว่าเครื่องมือ SE ยอมรับ html ใด ๆ ขอบคุณ
xenoterracide

ฉันไม่ทราบว่าคำหลัก kbd จะตีความอย่างถูกต้องว่า "ctrl" และ "+"! ฉันใช้แท็กแต่ละคีย์แยกกัน ขอบคุณ!
Olivier Dulac

2
@OlivierDulac น่าเสียดายที่มันไม่ได้นั่นเป็นเพียงวิธีที่ฉันใช้จัดรูปแบบแป้น ใครบางคนแก้ไขคำตอบของฉันในภายหลังเพื่อให้พวกเขาแยกกุญแจ
Michael Mrozek

30

เมื่อใช้ Bash ให้พิมพ์Control- Rแล้วเริ่มพิมพ์ การพิมพ์Control- Rซ้ำ ๆ หลังจากป้อนข้อความบางส่วนจะทำให้คุณย้อนกลับไปที่บรรทัดคำสั่งที่ตรงกัน


18

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


2
ขออภัยลืมเกี่ยวกับ zsh คุณอาจต้องเพิ่มการเชื่อมโยงคีย์นี้ใน ~ / .zshrc: bindkey '^ R' ประวัติเพิ่มขึ้นค้นหาค้นหาย้อนหลัง
decriptor

17

หากคุณเพิ่มดังต่อไปนี้ ~/.inputrc

"\e[5~": history-search-backward
"\e[6~": history-search-forward

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

(บางคนอาจชอบที่จะใช้\e[Aและ\e[Bซึ่งจะแทนที่ปกติUpและDownการกระทำแทนการผูกปุ่มใหม่)


ฉันชอบที่จะ map คำสั่งเหล่านี้ไปและAlt + Up Alt + Downเทอร์มินัลอีมูเลเตอร์ใช้ชุดค่าผสมเหล่านี้อาจถูกแมปกับ\E[Aและ\E[A(เช่น KDE Konsole กับการผูกคีย์ Linux) หรือ\E[1;3Aและ\E[1;3B(เช่น XFCE Terminal หรือ KDE Konsole พร้อม X 4 Bindings ฟรี)
Christian Herenz

9

พรอมต์โต้ตอบที่เรียกใช้โดยCtrl- Rซึ่งถูกกล่าวถึงแล้วเป็นวิธีที่สะดวกที่สุด นอกจากนี้ยังเป็นที่นิยมในการแมปUpและDownปุ่มลูกศรในการค้นหาประวัติสำหรับคำนำหน้าในขณะนี้ในบรรทัดคำสั่งอย่างไรก็ตามเรื่องนี้ต้องมีการเปลี่ยนแปลง~/.inputrcไฟล์

โซลูชันแบบคลาสสิกและแบบโต้ตอบน้อยกว่าคือการใช้การขยายประวัติเชลล์ การพิมพ์

!foo

จะดำเนินการคำสั่งสุดท้ายที่เริ่มต้นด้วยfooและ

!?foo

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


6

ถ้าคุณเพิ่มstty -ixonที่คุณ~/.bashrcไฟล์แล้วCtrl- sจะไปในทิศทางตรงกันข้ามกับ-Ctrlr


ผมอยากจะใช้C-sเพื่อจุดประสงค์นี้ แต่มินัลของฉันมีแช่แข็ง ; ระวัง! (ดีฉันยังไม่ได้จ้างเลยstty ixonไม่แน่ใจว่าจะทำอะไร)
imz - Ivan Zakharyaschev

3
@imz: C-qจะ "ทำน้ำแข็งให้ละลาย" และC-sเป็นอักขระควบคุมการไหลของซอฟต์แวร์ตามปกติซึ่งครั้งหนึ่งมีประโยชน์ในการขัดจังหวะด้วยตนเอง (หยุดชั่วคราว) การไหลของเอาต์พุตเมื่อใช้การเชื่อมต่อแบบอนุกรมช้า ตอนนี้เอาต์พุตจะเร็วมากในกรณีส่วนใหญ่ซึ่งสิ่งที่คุณต้องการดูเมื่อคุณกดC-sได้เลื่อนไปแล้ว stty -ixonปิดการควบคุมการไหลของซอฟต์แวร์
Dennis Williamson

Fantastic! ฉันค้นหามาหลายปีเพื่อหาหนทางที่จะเลื่อนไปข้างหน้าในประวัติศาสตร์เช่นนี้
marlar


2

อาจเฉพาะ zsh ในการค้นคว้าคำตอบนี้ฉันพบว่า vi-history-search-backwardอนุญาตให้หนึ่งทำการค้นหาด้วย/ในโหมด vi (ซึ่งฉันไม่ได้กล่าวถึงฉันอยู่) คุณสามารถใช้nและNเพื่อค้นหาไปข้างหน้าและข้างหลังตามลำดับ (หลังจากกดenter)


2

ฉันประหลาดใจที่ไม่ได้พูดถึง - แต่คุณสามารถเลือกโหมด vi ใน bash หรือ ksh โดยทำสิ่งนี้:

set -o vi

... หรือใช้สิ่งนี้เป็นเนื้อหาของ~/.inputrc(สำหรับ readline GNU ที่ใช้ในโปรแกรมเช่นทุบตี):

set editing-mode vi

หลังจากนั้นคุณสามารถใช้Escเพื่อเข้าสู่โหมดคำสั่งและใช้kเพื่อย้อนกลับไปในประวัติศาสตร์และjเพื่อไปข้างหน้า คุณสามารถค้นหาโดยใช้/เพื่อค้นหาได้ตามปกติและ?ค้นหาแบบย้อนกลับ

ถ้าคุณใช้~/.inputrcสิ่งนี้จะทำงานได้ไม่เฉพาะใน GNU bash เท่านั้น แต่จะใช้อะไรก็ได้ที่ใช้ GNU readline เช่น CLISP และโปรแกรมอื่น ๆ เช่น command command MySQL และ CPAN shell


2

หากต้องการสลับไปข้างหน้าเมื่อใช้การค้นหาแบบย้อนกลับ (ด้วยคำสั่ง Ctrl-R):

  1. เปิดไฟล์. bashrc ของคุณ:
    sudo gedit ~/.bashrc

  2. เพิ่มบรรทัดนี้ (ตัวอักษร "f" สามารถถูกแทนที่ด้วยอันที่ยังไม่ได้ใช้โดยระบบ)

    bind '"\C-f": forward-search-history' 
  3. ปิดไฟล์ของคุณและอัพเดต. bashrc (หรือเปิดเทอร์มินัลอื่น) ด้วยคำสั่ง:
    source ~/.bashrcหรือ. ~/.bashrc

ตอนนี้คุณสามารถเดินหน้าต่อไปในประวัติศาสตร์ด้วยปุ่มลัด: Ctrl + f

ทำงานบน Ubuntu 18.04 LTS


1

ฉันใช้สองครั้งต่อไปนี้เป็นส่วนใหญ่
แต่โปรดสังเกตว่าพวกเขาทั้งคู่ค้นหาตัวอักษรเริ่มต้น

  1. tcsh : พิมพ์ charecters บางส่วนของคำสั่งแล้วEsc+pมันจะแสดงคำสั่งก่อนหน้านี้เริ่มต้นด้วยลำดับของคีย์ที่กดมันอีกครั้งมันจะแสดงคำสั่งอื่น
  2. ksh : ใช้fc -e - <SPACE> <first few char for your previous >สิ่งนี้จะเรียกใช้คำสั่งล่าสุดที่ตรงกับลำดับนั้น

ฉันไม่พบสิ่งที่ต้องการเช่นCtrl+ Rใน Bash สำหรับ ksh และ tcsh ของฉัน


3
Ctrl + r ทำงานแตกต่างกันเล็กน้อยใน ksh กว่า Bash กด Ctrl + R แล้วพิมพ์สตริงคุณกำลังมองหาและกด หากต้องการค้นหาสิ่งเดียวกันให้กด Ctrl + r และป้อนโดยไม่ต้องพิมพ์สตริงอีกครั้ง นี่คือในset -o emacsโหมดโดยวิธีการ
Dennis Williamson

@Dennis: +1 :-)
Hemant

1

ไม่มีทางที่จะใช้เป็นCtrl- Rมีtcsh เพิ่มสิ่งต่อไปนี้ในของคุณ~/.cshrc :

bindkey "^r" i-search-back (มันเป็นเพียงเครื่องหมายรูปหมวกและตัวอักษร r)

นั่นเป็นเวลาที่ประหยัดที่สุดสำหรับฉัน


1

คำตอบคล้ายกับ @ephemient แต่คุณสามารถใส่ลงใน. bashrc ของคุณได้

bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-foward'

และพิมพ์ส่วนหนึ่งของวลีจากนั้นใช้ลูกศรขึ้น / ลงเพื่อเรียกดูตัวเลือกล่าสุดที่ตรงกับ นี่คือพฤติกรรมเริ่มต้นของ matlab

สำหรับคนส่วนใหญ่หากคุณต้องการโอนการตั้งค่าของคุณไปยังระบบใหม่มันง่ายกว่าที่จะจำอุปสรรค์ของคุณ~/.bashrcว่าคุณต้องขัดขวางสิ่งนั้น~/.inputrc


0

ใช่มันมีอยู่อย่างน้อยถ้าคุณใช้ zsh เพียงแค่เริ่มพิมพ์คำสั่งแล้วกดM-p( ESC p) แล้วมันจะค้นหาคำสั่งก่อนหน้าซึ่งตรงกับสิ่งที่คุณพิมพ์ กดอีกครั้งเพื่อค้นหาการแข่งขันถัดไป


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