ฉันสามารถค้นหาประวัติด้วยการทุบตีและเรียกใช้ผลลัพธ์ได้หรือไม่
ฉันสามารถค้นหาประวัติด้วยการทุบตีและเรียกใช้ผลลัพธ์ได้หรือไม่
คำตอบ:
พิมพ์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 ประวัติความเป็นมา
shopt
ไปใน bashrc ไม่ใช่ bash_profile (มิเช่นนั้นจะไม่ถูกเปิดใช้งานสำหรับเชลล์ที่ไม่ใช่ล็อกอินเชลล์)
เป็นทางเลือกให้crtl+Rคุณสามารถค้นหาประวัติโดยการพิมพ์
!text
นี่จะค้นหาประวัติคำสั่งล่าสุดที่เริ่มต้นด้วย 'ข้อความ'
แต่ฉันขอแนะนำให้คุณใส่ใน. bashrc ของคุณเพื่อป้องกันการดำเนินการคำสั่งที่ไม่ถูกต้อง
shopt -s histverify
สิ่งนี้สั่งให้ทุบตีดังกล่าวซึ่งหลังจากการกระทำประวัติใด ๆ (เช่น!!:s/prev_text/after_text
) มันจะวางบรรทัดผลลัพธ์ไปยังพรอมต์คำสั่ง จากนั้นคุณสามารถตรวจสอบหรือแก้ไขคำสั่งแล้วกด Enter หลังจากนั้น
คุณสามารถทำได้:
history | grep "stuff"
มันจะกลับมาเหมือน
num stuff
จากนั้นคุณสามารถพิมพ์
!num
ฉันชอบที่จะใช้ history-search-backward มากกว่า reverse-search-history ตัวก่อนหน้าให้คุณพิมพ์อักขระสองสามตัวของคำสั่งจากนั้นกดปุ่มค้นหาซึ่งต่างกับการกดปุ่มค้นหาก่อนจากนั้นจึงพิมพ์สตริงการค้นหา
ตามค่าเริ่มต้นในระบบของฉัน, Mp และ Mn ผูกกับฟังก์ชั่นที่คล้ายกัน แต่ฉันชอบที่จะผูกปุ่มลูกศร:
bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
ฉันมีนามแฝงที่ยอดเยี่ยมจริงๆ มันเป็นเพียงแค่ "history | grep" แต่ฉันกรองรายการ "คำสั่ง h" ก่อนหน้าด้วย "grep -E -v"
alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "
ใช้เหมือน
h aliases
2003 less .bash_aliases
HISTIGNORE
นอกจากนี้ยังสามารถทำได้โดยการเพิ่มคำสั่งไปยัง
เขียนดีฌอน! ฉันต้องการแสดงความคิดเห็น แต่ฉันมีชื่อเสียงไม่กี่คะแนนที่ขี้อาย :-)
เทคนิคที่เกี่ยวข้องและมีประโยชน์อีกประการหนึ่งคือความสามารถในการเรียกใช้คำสั่งก่อนหน้าขณะที่เปลี่ยนคำ สมมติว่าคุณพิมพ์ชื่อไดเรกทอรีหรือต้องการเปลี่ยนชื่อไฟล์:
$ echo ฉันชื่อบ๊อบ ฉันชื่อบ๊อบ $ ^ bob ^ jordan สะท้อนชื่อของฉันคือจอร์แดน ฉันชื่อจอร์แดน
โปรดสังเกตว่าคำสั่งถูกขยายแทนที่และเอาท์พุทก่อนที่คำสั่งจะถูกเรียกใช้ดังนั้นหากคำสั่งที่ไม่ถูกต้องถูกเรียกใช้คุณจะเห็นว่า bash คิดว่ามันกำลังทำอะไรอยู่
เนื่องจากการนำทางผ่านประวัติโดยใช้ Ctrl-r นั้นยุ่งยาก IMO คุณอาจต้องพิจารณาhh :
https://github.com/dvorka/hstr
ซึ่งทำให้การนำทางง่ายขึ้นตรงไปตรงมาและมีประสิทธิภาพมาก - รวมถึงการรันคำสั่ง:
ctrl + r
ตอนนี้มันจะผูกกับค่าเริ่มต้น
ที่พรอมต์คำสั่ง bash ให้พิมพ์ control-R จากนั้นพิมพ์อักขระสองสามตัวของคำสั่งที่คุณต้องการและเครื่องมืออำนวยความสะดวก readline ของ bash จะค้นหาประวัติคำสั่งสำหรับคำสั่งนั้น
หลังจากคุณเริ่มการค้นหาคุณสามารถพิมพ์ control-R อีกครั้งเพื่อข้ามไปยังคำสั่งที่ตรงกันถัดไป
หากคุณมีเปลือกของคุณกำหนดค่าให้ใช้vi
ปุ่มลัด ( set -o vi
หรือมีset editing-mode vi
ใน$HOME/.inputrc
) แล้วคุณค้นหาด้วย<Esc>/some-command<Return>
และกดn
(ถัดไป) หรือShift-n
(ก่อนหน้า) เพื่อวงจรผ่านประวัติศาสตร์บรรทัดคำสั่ง
CTRL+ ใช้Rงานได้ดีอย่างที่แนะนำ @ John1024 แต่ค่อนข้างน่าเบื่อถ้าคำสั่งล่าสุดหลายคำของคุณเหมือนกันและคุณต้องการวิธีที่รวดเร็วในการสแกนพวกเขาทั้งหมด ทางเลือกอื่นคือใช้history
:
$ history | grep keyword
ฉันชอบ 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-K
Enter
--height
: ตั้งค่าจำนวนบรรทัดที่แสดง--tac
: ย้อนกลับรายการ (ตรรกะมากขึ้นสำหรับประวัติ)--tiebreak=index
: เก็บลำดับประวัติเมื่อ fzf อัปเดตผลลัพธ์