ฉันจะค้นหาประวัติทุบตีและรันคำสั่งอีกครั้งได้อย่างไร


297

ฉันสามารถค้นหาประวัติด้วยการทุบตีและเรียกใช้ผลลัพธ์ได้หรือไม่

คำตอบ:


428

พิมพ์Ctrl Rที่บรรทัดคำสั่งและเริ่มพิมพ์คำสั่งก่อนหน้า เมื่อผลปรากฏขึ้นให้กดปุ่มCtrl Rเพื่อดูการแข่งขันอื่น ๆ เมื่อคำสั่งที่คุณต้องการปรากฏขึ้นเพียงกดEnter

โปรดทราบว่า while Ctrl Rเป็นค่าเริ่มต้นหากคุณต้องการให้คำสั่ง ( reverse-search-history) ถูกผูกไว้กับCtrl Tคุณสามารถกำหนดค่าดังต่อไปนี้:

ผูก '"\ Ct": ย้อนกลับค้นหาประวัติ'

มีโฮสต์ทั้งหมดของคำสั่ง bindable readline อื่น ๆ ที่มีให้คุณเช่นกัน ลองดูที่เป็นหน้าคนbash

Bash มีสิ่งอำนวยความสะดวกมากมายในการค้นหาและเข้าถึงประวัติคำสั่งแบบโต้ตอบ พื้นฐานที่สุดซึ่งเป็นแบบhistoryบิลท์อิน พิมพ์เพียง:

$ ประวัติ

จะพิมพ์รายการคำสั่งพร้อมกับดัชนีตัวเลขเช่น:

$ ประวัติ
1 ที่ชัดเจน
2 ls -al
3 vim ~ / somefile.txt
4 ประวัติศาสตร์
$

จากนั้นคุณสามารถดำเนินการคำสั่งใด ๆ เหล่านี้โดยใช้ดัชนีตัวเลขของพวกเขาโดย prefacing ดัชนีที่มีเพียงหนึ่งเดียว!ตามที่มิทช์ชี้ให้เห็น:

$! 1

จะดำเนินการclearคำสั่ง ประวัติความเป็นมาในตัวมีคุณสมบัติมากมายคุณสามารถดูได้มากขึ้นในหน้าคนbashและhistory

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

$! -2

ซึ่งโดยทั่วไปจะบอกว่าทุบตีเพื่อรันคำสั่งที่คุณรัน "สองคำสั่งก่อนหน้า" ในการรันคำสั่งก่อนหน้าในรายการประวัติเราสามารถใช้!!(ซึ่งเป็นเพียงการย่อ!-1)

ตัว!ออกแบบไม่ได้ จำกัด ให้คุณระบุตัวเลขคำสั่งที่จะเรียกใช้ hayalciแสดงให้เห็นว่าคุณสามารถสั่งbashให้รันคำสั่งตามข้อความที่เริ่มต้นด้วย (โดยใช้!) หรือข้อความภายในคำสั่งเอง (โดยใช้!?) อีกครั้งโดยใช้รายการประวัติตัวอย่างของเราด้านบนหากเราต้องการดำเนินการclearอีกครั้งสิ่งที่เราต้องทำคือพิมพ์:

$! cl

Enterและกด แล้วมันเกี่ยวกับvimอะไร? นั่นง่ายเหมือน:

บางส่วน

จุดที่สำคัญที่สุดจากhayalciการตอบสนองก็คือการเรียกไปshoptในตัว:

$ shopt -s histverify

นี้จะช่วยให้การตรวจสอบประวัติเพื่อให้คำสั่งที่ได้รับการจับคู่โดย!, !!และ!?designators ยังไม่ได้ดำเนินการสุ่มสี่สุ่มห้า แต่แทนที่จะเติมเต็มในในบรรทัดคำสั่งเพื่อให้คุณสามารถมั่นใจได้ว่าพวกเขาจะทำชั่วไม่มีพวกเขาก่อนที่จะดำเนิน สิ่งนี้สำคัญกว่าเมื่อคุณเรียกใช้คำสั่งในฐานะผู้ใช้รูท ตัวเลือกนี้สามารถตั้งค่าใน.bashrcไฟล์เริ่มต้นของคุณเพื่อให้มันถูกตั้งค่าเมื่อใดก็ตามที่คุณเข้าสู่ระบบ

ในฐานะที่ได้รับการชี้ให้เห็นข้อมูลทั้งหมดนี้สามารถรวบรวมได้จากหน้าคนbash สำหรับ!, !!, และ!? designators ให้ดูที่มาตราการขยายตัว 9.3 ประวัติความเป็นมา


39
+1 ฉันใช้ Linux มานานกว่า 12 ปีสำหรับทุกระบบ ฉันไม่รู้ว่ามีอยู่จริง หวังว่าฉันจะได้ 10 ฉันคิดถึงมันได้อย่างไร
ไอเดนเบลล์

1
ในหลาย ๆ ระบบการกดลูกศรขึ้นก็ทำเช่นเดียวกัน
mas

หากใครบางคนจะรวม '!', '!!', '!?', 'ประวัติศาสตร์ | grep' และ 'Ctrl-R' เป็นคำตอบที่ครอบคลุมผมจะเลือก
ริชาร์ดฮอสกิ้นส์

shoptไปใน bashrc ไม่ใช่ bash_profile (มิเช่นนั้นจะไม่ถูกเปิดใช้งานสำหรับเชลล์ที่ไม่ใช่ล็อกอินเชลล์)
Tobu

2
นอกจากนี้หลังจากกด CTRL + R คุณสามารถใช้ CTRL + SHIFT + R หลายครั้งเพื่อข้ามกลับไปยังคำสั่งก่อนหน้า
Gal Bracha

37

เป็นทางเลือกให้crtl+Rคุณสามารถค้นหาประวัติโดยการพิมพ์

!text

นี่จะค้นหาประวัติคำสั่งล่าสุดที่เริ่มต้นด้วย 'ข้อความ'

แต่ฉันขอแนะนำให้คุณใส่ใน. bashrc ของคุณเพื่อป้องกันการดำเนินการคำสั่งที่ไม่ถูกต้อง

shopt -s histverify

สิ่งนี้สั่งให้ทุบตีดังกล่าวซึ่งหลังจากการกระทำประวัติใด ๆ (เช่น!!:s/prev_text/after_text) มันจะวางบรรทัดผลลัพธ์ไปยังพรอมต์คำสั่ง จากนั้นคุณสามารถตรวจสอบหรือแก้ไขคำสั่งแล้วกด Enter หลังจากนั้น


5
ใช้!? text เพื่อเรียกใช้งานคำสั่งล่าสุดที่มีคำว่า "text" อีกครั้ง
mark4o

3
หากใครบางคนจะรวม '!', '!!', '!?', 'ประวัติศาสตร์ | grep 'และ' ctrl-r 'เป็นคำตอบที่ครอบคลุมฉันจะเลือก
ริชาร์ดฮอสกิ้นส์

32

คุณสามารถทำได้:

history | grep "stuff"

มันจะกลับมาเหมือน

num stuff

จากนั้นคุณสามารถพิมพ์

!num

15

ฉันชอบที่จะใช้ history-search-backward มากกว่า reverse-search-history ตัวก่อนหน้าให้คุณพิมพ์อักขระสองสามตัวของคำสั่งจากนั้นกดปุ่มค้นหาซึ่งต่างกับการกดปุ่มค้นหาก่อนจากนั้นจึงพิมพ์สตริงการค้นหา

ตามค่าเริ่มต้นในระบบของฉัน, Mp และ Mn ผูกกับฟังก์ชั่นที่คล้ายกัน แต่ฉันชอบที่จะผูกปุ่มลูกศร:

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

13

ฉันมีนามแฝงที่ยอดเยี่ยมจริงๆ มันเป็นเพียงแค่ "history | grep" แต่ฉันกรองรายการ "คำสั่ง h" ก่อนหน้าด้วย "grep -E -v"

alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "

ใช้เหมือน

h aliases
2003  less .bash_aliases

1
HISTIGNOREนอกจากนี้ยังสามารถทำได้โดยการเพิ่มคำสั่งไปยัง
tanenbring

12

เขียนดีฌอน! ฉันต้องการแสดงความคิดเห็น แต่ฉันมีชื่อเสียงไม่กี่คะแนนที่ขี้อาย :-)

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

$ echo ฉันชื่อบ๊อบ
ฉันชื่อบ๊อบ
$ ^ bob ^ jordan
สะท้อนชื่อของฉันคือจอร์แดน
ฉันชื่อจอร์แดน

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


6

เนื่องจากการนำทางผ่านประวัติโดยใช้ Ctrl-r นั้นยุ่งยาก IMO คุณอาจต้องพิจารณาhh :

https://github.com/dvorka/hstr

ซึ่งทำให้การนำทางง่ายขึ้นตรงไปตรงมาและมีประสิทธิภาพมาก - รวมถึงการรันคำสั่ง:

ป้อนคำอธิบายรูปภาพที่นี่


วิธีใช้งาน ปุ่มใดที่กดเพื่อดูภาพนี้
Nakilon

2
เมื่อคุณติดตั้ง hh คุณสามารถใช้คำสั่ง hh หรือผูกไว้กับแป้นพิมพ์ลัด (โดยทั่วไปคือ Ctrl-r) ตามที่อธิบายไว้ในเอกสารประกอบ
Martin Dvorak

ctrl + rตอนนี้มันจะผูกกับค่าเริ่มต้น
Alleo

4

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

หลังจากคุณเริ่มการค้นหาคุณสามารถพิมพ์ control-R อีกครั้งเพื่อข้ามไปยังคำสั่งที่ตรงกันถัดไป


3

หากคุณมีเปลือกของคุณกำหนดค่าให้ใช้viปุ่มลัด ( set -o viหรือมีset editing-mode viใน$HOME/.inputrc) แล้วคุณค้นหาด้วย<Esc>/some-command<Return>และกดn(ถัดไป) หรือShift-n(ก่อนหน้า) เพื่อวงจรผ่านประวัติศาสตร์บรรทัดคำสั่ง


อันนี้ใกล้เคียงกับผู้ใช้กลุ่มมากที่สุด
Gabor Marton

2

CTRL+ ใช้Rงานได้ดีอย่างที่แนะนำ @ John1024 แต่ค่อนข้างน่าเบื่อถ้าคำสั่งล่าสุดหลายคำของคุณเหมือนกันและคุณต้องการวิธีที่รวดเร็วในการสแกนพวกเขาทั้งหมด ทางเลือกอื่นคือใช้history:

$ history | grep keyword

0

ฉันชอบ HSTR แต่ฉันไม่สามารถติดตั้งได้ในบางครั้ง ดังนั้นฉันจึงเขียนนามแฝงโดยใช้fzfซึ่งเลียนแบบพฤติกรรมของมัน ( hxสำหรับ "ดำเนินการประวัติ")

alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
  • history : ดีรับประวัติศาสตร์
  • sed : ลบคอลัมน์หมายเลขออกจากรายการ (POSIX)
  • fzfนี่คือความมหัศจรรย์ที่ช่วยให้คุณสามารถเลือนค้นหารายการโต้ตอบหรือย้ายไปอยู่กับC-Jและแล้วรันคำสั่งด้วยC-KEnter
  • --height : ตั้งค่าจำนวนบรรทัดที่แสดง
  • --tac : ย้อนกลับรายการ (ตรรกะมากขึ้นสำหรับประวัติ)
  • --tiebreak=index : เก็บลำดับประวัติเมื่อ fzf อัปเดตผลลัพธ์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.