มีวิธีการดำเนินการคำสั่งจากประวัติศาสตร์?


99

ตัวอย่างเช่น:

[root@ip-10-0-7-125 ~]# history | grep free
  594  free -m
  634  free -m | xargs | awk '{print "free/total memory" $17 " / " $ 8}'
  635  free -m
  636  free -m | xargs | awk '{print "free/total memory" $9 " / " $ 10}'
  736  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $9}'
  740  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $8}'
  741  free -m | xargs | awk '{print "free/total memory: " $17 " / " $8 " MB"}'

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


14
คุณจะรู้เกี่ยวกับctrl-r?
Carlos Campderrós

1
ใช่ฉันรู้ว่า แต่มันไม่ใช่สิ่งที่ฉันต้องการ
The One

คำตอบ:


170

ในทุบตีก็!636จะโอเค


12
In Linux- สิ่งนี้มีอะไรเพิ่มเติมเกี่ยวกับเชลล์ (bash, zsh, ฯลฯ ) ที่บุคคลกำลังเรียกใช้จากนั้นระบบปฏิบัติการที่คุณใช้งานอยู่ มีเชลล์อยู่บน linux โดยไม่รองรับประวัติ
Zoredache

@Zoredache และในทำนองเดียวกันมันก็ใช้ได้ดีในการใช้งานส่วนใหญ่ของ bash บน Windows
Ajedi32

1
แน่นอนไม่ใช่แค่ทุบตี แต่เปลือกอื่น ๆ ด้วย - รวมถึง csh
ดึง

5
หากคุณมีคำสั่งที่คล้ายกับสิ่งที่คุณต้องการเรียกใช้คุณสามารถต่อท้าย:pเพื่อพิมพ์คำสั่งโดยไม่เรียกใช้!636:pตัวอย่างเช่น ซึ่งหมายความว่าคุณสามารถเลือกได้อย่างง่ายดายอีกครั้งจากประวัติของคุณโดยกดลูกศรขึ้นและทำการเปลี่ยนแปลงเล็กน้อยที่คุณต้องการ
AJefferiss

78

ใช่เรียกว่า "การขยายประวัติ" ดู

LESS='+/^HISTORY EXPANSION' man bash

สำหรับรายละเอียดทั้งหมด

การใช้เครื่องหมายอัศเจรีย์ตามด้วยตัวเลขนั้นเป็นการใช้งานที่ง่ายที่สุด:

!636

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

!!

หรือคุณสามารถเรียกใช้สองคำสั่งย้อนกลับ:

!-2

อย่างไรก็ตามรูปแบบที่ฉันใช้บ่อยที่สุดคือการทำซ้ำอาร์กิวเมนต์สุดท้ายของคำสั่งสุดท้าย:

echo this text goes into a file > /tmp/afile.txt
cat !$

หรือสมมุติว่าฉันกำลังตรวจสอบไฟล์ เมื่อใช้แท็บเสร็จฉันอาจทำสิ่งต่อไปนี้:

ls -l /really/long/path/to/some/file
less !$

อีกครั้งอ่านหน้าคนสำหรับรายละเอียดเพิ่มเติมได้ที่:

LESS='+/^HISTORY EXPANSION' man bash

25
โต้ตอบได้สะดวกกว่าAlt-. !$มันแทรกอาร์กิวเมนต์สุดท้ายของคำสั่งสุดท้ายคำต่อคำลงในบรรทัด
ulidtko

2
@ulidtko เอกสารพิเศษทางหนีเหล่านี้อยู่ที่ไหน (ฉันรู้!$แต่ไม่เคยได้ยินAlt-.) คุณจะโพสต์ลิงก์ไปยังมันได้ไหม
edmz

5
LESS="+/DEFAULT KEY BINDINGS" man 3 readline, ,/etc/inputrc ~/.inputrcหลายโปรแกรมนอกเหนือจาก bash ใช้ libreadline สำหรับผู้ที่ทำคุณจะได้รับคุณสมบัติเดียวกันเช่นAlt-., Ctrl-X-U(ยกเลิก) Ctrl-/(อธิบายทางลัด) แท็บเสร็จ ฯลฯ - ฟรี ตัวอย่างเช่นมีเพียงสามบรรทัดของPYTHONSTARTUPหนึ่งสามารถเปิดใช้งานแท็บเสร็จและประวัติศาสตร์ในREPL หุ้นหลาม ซึ่งจะใช้งานได้ (ส่วนใหญ่) เหมือนกับในทุบตีเนื่องจากเป็นไลบรารี GNU Readline ที่ทำงาน manpage ของ readline อธิบายคุณสมบัติโดยละเอียด
ulidtko

2
นอกจากนี้ Ctl-UpArrow (หรือ AltUpArrow เมื่อทุบตี) จะเลื่อนไปด้านหลังผ่านรายการประวัติ การพิมพ์อักขระสองสามตัวจากนั้น UpArrow จะได้รับเฉพาะคำสั่งที่ขึ้นต้นด้วยตัวอักษรนั้นเช่น "fr (Ctl-Up)" จะเลื่อนไปตามคำสั่ง "ฟรี ... " ทั้งหมดในรายการของ OP นอกจากนี้ยังทำงานในสิ่งต่าง ๆ เช่น gnuplot & gdb ที่ใช้ readline
jamesqf

2
@ Ajedi32 ดูบรรทัดตัวหนาสุดท้ายในคำตอบของฉัน :) ความจริงคำตอบนี้เป็นแทบรสชาติของสิ่งที่การขยายตัวของประวัติศาสตร์สามารถทำได้ โปรดจำไว้ว่านี่คือระดับเชลล์ไม่ใช่คำสั่งที่คุณกำลังเรียก ดังนั้นecho {1..5}ตามด้วยtouch !$จะแตะห้าไฟล์ไม่ใช่แค่ไฟล์เดียว ดังนั้นการพูดอย่างเคร่งครัดมันไม่ได้เป็นอาร์กิวเมนต์สุดท้ายแต่เป็นคำสุดท้ายของเชลล์ในบรรทัดนั้น (ลองecho hello >tempตามด้วยecho goodbye !$) หากคุณนึกถึงวิธีที่จะทำให้ชัดเจนยิ่งขึ้นเพื่อแนะนำการแก้ไข
Wildcard

14

เป็นคนดีถ้าคุณไม่ต้องการประวัติคนแรกให้จดหมายเลข ฯลฯ :

ในทุบตี (และบางทีคนอื่น ๆ ):

ctrl-r something 

( ctrl-r= "ค้นหาแบบย้อนกลับแบบโต้ตอบ") ( something= ส่วนหนึ่งของคำสั่งก่อนหน้า)

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

อดีต:

ctrl-r  10

เพื่อแสดงบรรทัดประวัติล่าสุดที่มี '10' (สำหรับตัวอย่างบรรทัดด้วย$10ในตัวอย่างของคุณ) และctrl-rอีกครั้งจนกว่าคุณจะดึงข้อมูลประวัติที่คุณต้องการ

เมื่อเส้นที่คุณต้องการที่จะปรากฏเพียงEnterที่จะรัน (หรือคุณยังสามารถแก้ไขได้โดยใช้arrow keys, backspaceและctrl-aจะไปที่จุดเริ่มต้นของเส้นctrl-eที่จะได้รับไปยังจุดสิ้นสุด ctrl-k: จะ "ฆ่า" จากเคอร์เซอร์ไปยังจุดสิ้นสุดของเส้น (= ลบ + บันทึกไว้ในบัฟเฟอร์) ctrl-y: เพื่อกู้คืนจากบัฟเฟอร์บิตที่ถูกฆ่าก่อนหน้านี้ ฯลฯ )

หากคุณต้องการค้นหาไปข้างหน้า (ctrl-s) ก่อนอื่นคุณต้องปิดการใช้งาน XON : ดูhttps://stackoverflow.com/a/791800/1841533 :

"เพียงเพื่อปิดการใช้งาน XON / XOFF โดยการเรียกใช้

stty -ixon

"(และจากนั้นคุณจะสามารถใช้ ctrl-s โดยไม่ต้องหยุดการทำงานของเทอร์มินัล)


หากฉันทำสิ่งนี้และกด ctrl-r ครั้งเดียวมากเกินไปโดยไม่ตั้งใจมีวิธีใดในการค้นหาประวัติอีกครั้งหรือไม่
kasperd

@kasperd: ใช่คุณทำได้ คำตอบมากมายเกี่ยวกับ se ชี้ให้เห็น: ctrl-s สำหรับการค้นหาไปข้างหน้า
Olivier Dulac

น่าเสียดาย ctrl-s ถูกใช้เพื่อหยุดเทอร์มินัลและ bash ไม่ได้ปิดใช้งานดังนั้นจึงใช้ไม่ได้ในการกำหนดค่าเริ่มต้น (โปรแกรมอื่น ๆ - เช่น emacs - ปิดการใช้งานปุ่มลัดเพื่อตรึงขั้วเพื่อให้ ctrl-s สามารถใช้สำหรับการค้นหาได้)
kasperd

@kasperd: ใช่ขอโทษที่ไม่พูดถึงเรื่องก่อนหน้านี้ (ฉันได้ชี้ว่า "คำตอบมากมาย" เพราะพวกเขาทำอย่างนั้น แต่ฉันไม่ได้ใช้เวลาในการพิมพ์สิ่งนี้ในความคิดเห็นหรือให้ลิงก์ ... (ฉันใช้ของฉัน โทรศัพท์) ตอนนี้ฉันกลับมาที่บ้านและสามารถแก้ไขได้ในคำตอบข้างต้น ctrl-s สำหรับการค้นหาประวัติทุบตีต้องการให้คุณ stty -ixon ก่อน
Olivier Dulac

คำสั่งนั้นจะหยุดการใช้ ctrl-s ตามปกติดังนั้นจึงไม่ใช่ตัวเลือกจริงๆ
kasperd

7

คุณสามารถใช้เชลล์ builtin fc :

fc -s 636

2
นี่ดีกว่าคำตอบที่ยอมรับ แต่คุณต้องลบ-sเพื่อให้ได้ประโยชน์ หากคุณเรียกใช้fc 636คุณจะเปิดตัวแก้ไขด้วยคำสั่ง 636 จากประวัติของคุณในบัฟเฟอร์และเมื่อคุณบันทึกและออกจากคำสั่ง (แก้ไขหรือไม่) จะถูกเรียกใช้ และดียิ่งขึ้นอันนี้ POSIX
สัญลักษณ์แทน

@ สตีเว่นเพนนีขอบคุณ และใช่ฉันรู้ว่า POSIX คืออะไร แต่ฉันไม่เห็นความเกี่ยวข้อง ไม่ว่าเอกสารบางอย่างที่เข้าถึงได้ง่ายและรวมอยู่ด้วยก็น่าจะดี
Faheem Mitha

@FaheemMitha ลองเรียกใช้ "help fc"
สัญลักษณ์แทน

@ Wildcard helpไม่ใช่ POSIX - อาจต้องทำman dashหรือคล้ายกัน
Steven Penny

@ Wildcard ขอบคุณ ฉันมักจะลืมhelpอยู่ อีกตัวในเปลือก และทำให้งงสำหรับผู้ใช้ที่ไม่ระวังซึ่งอาจต้องการความช่วยเหลือเกี่ยวกับระบบใหม่ แต่กลับต้องเผชิญกับกระแสของการพูดพล่อยๆแทน :-(
Faheem Mitha

3

มีHSTR- hhคำสั่งสำหรับbashและzshการเลือกคำสั่งแบบโต้ตอบดีกว่าการค้นหาแบบย้อนกลับ Ctrl-R:

ตัวอย่างคำสั่งประวัติการโต้ตอบ hh

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

บน Ubuntu คุณสามารถติดตั้งhhด้วยหนึ่งซับต่อไปนี้:

sudo add-apt-repository ppa:ultradvorka/ppa && sudo apt-get update && sudo apt-get install hh && hh --show-configuration >> ~/.bashrc

หรือทีละขั้นตอน:

sudo add-apt-repository ppa:ultradvorka/ppa
sudo apt-get update
sudo apt-get install hh

ติดตั้งhhบน Fedora, RHEL หรือ CentOS:

sudo dnf|yum install hstr -y

บน macOS ด้วยhomebrew:

brew install hh

... จากนั้นกำหนดค่าด้วย:

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

สิ่งนี้จะแทนที่พฤติกรรม Ctrl-R เริ่มต้น

เรียกใช้hh --show-configurationเพื่อกำหนดสิ่งที่จะผนวกเข้ากับโปรไฟล์ Bash ของคุณ

ตัวเลือกการกำหนดค่าเพิ่มเติมมีอยู่ในหน้าแรกของโครงการที่ Github: https://github.com/dvorka/hstr

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