ฉันจะทำซ้ำคำสั่งสุดท้ายโดยไม่ต้องใช้ปุ่มลูกศรได้อย่างไร


115

ฉันรู้ว่าฉันสามารถใช้Upเพื่อวนซ้ำคำสั่งก่อนหน้า การรันสุดท้ายคำสั่งเพียงเกี่ยวข้องกับ+Up Enterแต่ผมคิดว่าการซื้อแป้นพิมพ์แฮปปี้แฮ็กvimเป็นฉันใช้จ่ายมากของเวลาในการ

แป้นพิมพ์นี้ไม่มีปุ่มลูกศรและวิธีเดียวที่ฉันรู้วิธีการทำงานประเภทนี้คือการกดCtrl+ Rและเริ่มทำซ้ำคำสั่งก่อนหน้าของฉัน

มีวิธีง่าย ๆ ในการเลียนแบบUp+ Enterในเทอร์มินัล UNIX ที่ไม่มีปุ่มลูกศรหรือไม่?


1
คุณควรแทนที่แท็กเทอร์มินัลด้วยเชลล์ที่คุณใช้
Cristian Ciupitu

2
@ illuminÉ no mouse ...
quant

ไม่ได้มีความสุขแฮ็คีย์บอร์ดยกเลิกในปี 2006?
Peter Mortensen

@PeterMortensen ยังไม่มีให้บริการ คุณอาจอ้างถึงรุ่นแรก แต่รุ่นที่ใหม่กว่าจะยังคงมีอยู่
quant

คำตอบ:


164

ด้วยcshหรือเปลือกการดำเนินการใด ๆcshเหมือนประวัติศาสตร์เปลี่ยนตัว ( tcsh, bash, zsh):

!!

Enterแล้วก็


หรืออีกทางหนึ่ง :

!-1

Enterแล้วก็


หรือCtrl+ P,Enter


พื้นที่เวทย์มนตร์

นอกจากนี้โปรดทราบว่า!!และ!-1จะไม่ขยายอัตโนมัติให้คุณจนกว่าคุณจะเรียกใช้งาน (เมื่อมันอาจจะสายเกินไป)

หากใช้bashคุณสามารถใส่bind Space:magic-spaceลงไป~/.bashrcแล้วกดSpaceหลังจากคำสั่งจะขยายอินไลน์โดยอัตโนมัติให้คุณตรวจสอบก่อนดำเนินการ นี้จะเป็นประโยชน์อย่างยิ่งสำหรับการขยายตัวของประวัติศาสตร์จากคำสั่งทำงานในขณะที่ที่ผ่านมาเช่นจะดึงคำสั่งสุดท้ายระยะที่เริ่มต้นด้วย!echo echoด้วยพื้นที่เวทย์มนตร์คุณจะได้รับตัวอย่างคำสั่งก่อนที่มันจะทำงาน

นั่นคือเทียบเท่ากับการทำbindkey ' ' magic-spaceในหรือtcshzsh


1
@Arman ดีใจที่ได้ช่วย มีคำสั่งการขยายประวัติทั้งหมดมากมาย ลิงก์แสดงรายการบางรายการ ฉันได้แก้ไขข้อมูลบางอย่างเกี่ยวกับเวทย์มนตร์อวกาศที่อาจช่วยในการใช้งานบางอย่าง
Sparhawk

3
magic-spaceนั่นคือทางเลือกที่หวาน!
fduff

1
นอกจากนี้ยังมีhistverifyตัวเลือกshoptที่จะทำให้ readline ทำการขยายประวัติ แต่ไม่ดำเนินการคำสั่งในการกดครั้งแรกของปุ่ม Enter ซึ่งจะช่วยให้คุณประเมินผลลัพธ์และตัดสินใจว่าเป็นสิ่งที่คุณต้องการเรียกใช้หรือไม่
Etan Reisner

2
ไม่เข้าใจว่าทำไม !! มีการใช้งานมากกว่า CTRL-P อย่างมาก CTRL-P ช่วยให้คุณเห็นคำสั่งก่อนที่จะดำเนินการ - และคุณยังสามารถทำการแก้ไขได้ ฉันมักจะรู้สึกเหมือนกำลังกลิ้งลูกเต๋ากับ !!
abonet

1
@abonet ใช้อีกที่ฉันเพิ่งพบ!!คือการใช้การขยายตัวในสถานที่ sudo !!เช่น
Sparhawk

50

เชลล์ส่วนใหญ่ที่มีคุณสมบัติการแก้ไขบรรทัดคำสั่งรองรับการเชื่อมโยงคีย์ Emacs (ชุดย่อยเล็ก ๆ )

Up     Ctrl+P
Down   Ctrl+N
Left   Ctrl+B
Right  Ctrl+F
Home   Ctrl+A
End    Ctrl+E
Delete Ctrl+D

หรือคุณสามารถตั้งค่าเชลล์ของคุณเพื่อใช้โหมดแก้ไขคำสั่ง vi โดยเพิ่มset -o viลงในไฟล์เริ่มต้นเชลล์ของคุณ (เช่น~/.bashrc) จากนั้นเช่นคุณสามารถ

  • ใช้EsckEnter เพื่อเรียกใช้คำสั่งก่อนหน้าอีกครั้ง (เหมือน!!) คีย์ลบ-ยังทำงานเป็นคำสั่ง "เลื่อนขึ้น"
  • ใช้EsckkkkkkkkkkkkEnter หรือEsc12kEnter ดำเนินการคำสั่งก่อนหน้า 12 อีกครั้ง (เหมือน!-12)
  • ใช้Escและคำสั่งการเคลื่อนไหว (เช่นkทำซ้ำอย่างเหมาะสม) แล้วแก้ไขบรรทัดคำสั่ง bash ที่คุณพบ โปรดจำไว้ว่าคุณจะยังคงอยู่ในviโหมดคำสั่งดังนั้นคุณจะต้องใช้viคำสั่งการแก้ไข (เช่นI, A, C, Rหรือหนึ่งของคู่พิมพ์เล็กของพวกเขา) ที่จริงการเพิ่มคำสั่งจากประวัติศาสตร์
    ดังนั้นสำหรับตัวอย่างเช่นเทียบเท่ากับEsckisudoSpaceEntersudo !!
  • สำหรับผู้ใช้ขั้นสูง: คุณสามารถคัดลอกข้อความ ( y ank) จากบรรทัดหนึ่งแล้ววาง ( p ut) ลงในอีกบรรทัดหนึ่งเพื่อให้คุณสามารถบรรลุผลลัพธ์ที่เทียบเคียง!-2:- !$ได้ (น่าเสียดายที่ดูเหมือนจะไม่รองรับบัฟเฟอร์ที่ตั้งชื่อ)

ผมรู้เกี่ยวกับความสัมพันธ์ emacs กับขั้ว ... แต่viเคล็ดลับได้ดี !!!
Dox

ฉันได้รับdeleteCtl + u ใน Zsh
Timo

1
สิ่งนี้ถูกนำไปใช้โดยไลบรารี readline อาจพบทางลัดเพิ่มเติมในเอกสารประกอบ
Spidey

28

คนที่ฉันชอบคือCTRL+ Pแล้วCTRL+O

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

โปรดทราบว่าสามารถใช้CTRL+ Oได้หลายครั้งเท่าที่คุณต้องการ


2
^ O ไม่ได้ทำอะไรบน Mac ของฉัน
Snowcrash

1
@Snowcrash ลอง^J
เดซี่

นั่นเป็นเพียงการสะท้อนบรรทัดว่างแม้ว่าฉันได้ทำlsหรือpwdก่อนหน้า
Snowcrash

@Snow Crash มันเป็น ^ P ดังนั้น ^ J ...
daisy

Ctrl + P ไม่ทำงานบน HP-UX (ฉันไม่รู้ว่ามันใช้เชลล์ตัวใด) วิธีแก้ปัญหาคือเรียกใช้ `zsh '
Peter Mortensen

15

แน่นอน! เมื่อคุณคุ้นเคยกับการviโยงคีย์ทำไมไม่กำหนดค่าเชลล์เพื่อตอบกลับ สำหรับbashใส่ในของคุณ~/.inputrc:

set editing-mode vi

การใช้งานอินสแตนซ์ของ bash จะไม่อ่านไฟล์อีกครั้งดังนั้นออกจากระบบและกลับเข้ามาใหม่

zshแม้จะตรวจสอบเรื่องนี้ให้คุณ: ถ้าไม่มีสคริปต์เริ่มต้นของคุณบังคับโหมดการแก้ไขวิธีหนึ่งหรืออื่น ๆ ที่ใช้bindkey และถ้า$EDITORตัวแปรสภาพแวดล้อมมีการตรวจพบจะมีviแล้วมันจะช่วยให้vikeybindings หากคุณต้องการบังคับให้ใส่สิ่งนี้ใน~/.zshrc:

bindkey -v

หลังจากนั้นใช้ESCตามปกติเพื่อป้อนบรรทัดคำสั่งและkและjเพื่อเลื่อนขึ้นและลง

ยัง : ผูกเริ่มต้นเปลือกหอยในที่สุดคือการผูก emacs ดังนั้นจริงCrtl-PและCtrl-Nแล้วควรจะทำงานโดยคุณไม่ต้องเปลี่ยนแปลงอะไร


9

ด้วยเปลือก POSIX ใดการดำเนินการของผู้ใช้พกพาตัวเลือก (รวมksh, zsh, bash, yash) คุณยังสามารถใช้fcคำสั่ง:

fc -e : -1

ดูตัวอย่าง:

$ echo "hello"
hello

$ fc -e : -1
echo "hello"
hello

ข้อมูลเพิ่มเติมในExecute คำสั่งต่าง ๆ จากคำตอบของประวัติศาสตร์โดย Jonathan Leffler


6

สำหรับผู้ใช้ Mac iterm2 ทั้งหมด:

คุณสามารถผูก+ ไปR 0x0C 0x10 0x0dนี่จะล้างข้อมูลเทอร์มินัลและเรียกใช้คำสั่งสุดท้าย

การตั้งค่าที่สำคัญ iterm 2


มีวิธีใดที่จะทำซ้ำคำสั่งสุดท้ายโดยไม่ล้างข้อมูลเทอร์มินัล
ลุคเดวิส

อาไม่เป็นไร: สำหรับทุกคนที่อ่านข้อความนี้เพื่อทำซ้ำโดยไม่ต้องล้างเครื่องให้ใช้0x10 0x0d(เช่นไม่ใช้0x0C)
ลุคเดวิส

5

ฉันคิดว่าฉันต้องทำซ้ำคำสั่งในฐานะผู้ใช้ขั้นสูงบ่อยครั้งดังนั้น

sudo !!

ทำซ้ำคำสั่งก่อนหน้าราวกับว่าฉันจำได้ว่าพิมพ์sudoครั้งแรก


2
ฉันชอบสิ่งนี้มากและดูเหมือนว่าการตอบสนองที่ดีต่อ "การอนุญาตที่ถูกปฏิเสธ" "ฉันหมายถึง sudo ffs!"
Viktor Mellgren

3

kshเปลือกมีนามแฝงเริ่มต้นrที่ซ้ำคำสั่งล่าสุด มันถูกผูกไว้กับfc -s:

alias r='fc -s'

น่าสนใจbashเอกสารประกอบสำหรับfcbuiltin ( help fcและในคู่มือด้วยตนเอง) แม้จะกล่าวถึงเรื่องนี้ แต่ไม่ใช่นามแฝงเริ่มต้นในเชลล์นั้น:

นามแฝงที่มีประโยชน์ที่จะใช้กับสิ่งนี้คือr='fc -s'เพื่อให้การพิมพ์r cc รันคำสั่งสุดท้ายที่เริ่มต้นด้วยccและพิมพ์rคำสั่งสุดท้ายอีกครั้ง

ในbashสิ่งนี้จะได้ผลแม้ว่าคุณจะปิดการขยายประวัติศาสตร์ออกไปด้วยset +Hก็ตาม

ในzshเปลือกมีในตัวที่เป็นเอกสารที่จะเป็นเช่นเดียวกับrfc -e -

fcยูทิลิตี้เป็นสาธารณูปโภคที่มีมาตรฐาน POSIX


2

ด้วยcshหรือเปลือกใด ๆ ดำเนินการcshเหมือนประวัติศาสตร์เปลี่ยนตัว ( tcsh, bash, zsh) คุณยังสามารถใช้ในการเรียกคำสั่งสุดท้ายที่ขึ้นต้นด้วย!<beginning of command><beginning of command>

เช่นถ้าคุณวิ่ง

$ tail file.txt
$ less otherfile.txt
$ !ta

!ta จะดำเนินการ tail file.txt


1

tl; dr !!เพียงต่อท้ายคำสั่งสุดท้ายกับคำสั่งปัจจุบันของคุณ <backtick>!!<backtick> ดำเนินการคำสั่งสุดท้ายและผนวกเอาต์พุตไปยังคำสั่งปัจจุบันของคุณ

จริงๆแล้วมี 2 รูปแบบ:

  1. คำสั่งสุดท้ายนั้นเอง
  2. ผลลัพธ์ของคำสั่งสุดท้าย

ให้ฉันแสดงตัวอย่าง 2 ตัวอย่าง:

ตัวอย่างที่ 1

$ mkdir /test
mkdir: /test: Permission denied

$ sudo !!
sudo mkdir /test
Password:

ตามที่คุณเห็นด้านบนฉันกำลังดำเนินการคำสั่งและเพียงแค่ต่อท้ายคำสั่งสุดท้าย

อีกรูปแบบหนึ่ง

ตัวอย่างที่ 2

$ find ~/Documents "test.txt"
/Users/<user>/Documents/test.txt

$ vi `!!`
# Opens test.txt. But if you do
$ vi !!
vi find ~/Documents -name "test.txt"
VIM - Vi IMproved 8.1 (2018 May 18, compiled Oct 29 2018 06:55:58)
Unknown option argument: "-name"
More info with: "vim -h"

+1 vi `!!`สำหรับ มีประโยชน์มาก
le_daim

0

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


0

คุณสามารถใช้!nเพื่อรันคำสั่ง nth ในเทอร์มินัล โดยที่ 'n' คือบรรทัดที่ไม่มีhistoryคำสั่ง


เชลล์ตัวใดที่ขยาย!?ไปยังคำสั่งสุดท้าย? คุณแน่ใจว่าคุณไม่ผสมมันขึ้นกับ!!(ซึ่งได้รับการกล่าวถึงในคำตอบอื่น ๆ )?
Anthony Geoghegan

ขออภัยจริง ๆ แล้วฉันกำลังทดลองคำสั่งนี้ในเวลานั้น โปรดตรวจสอบคำตอบที่แก้ไข @AnthonyGeoghegan
Ravi Sevta

นี่คือทางลัดที่ฉันกำลังมองหา ขอบคุณ!
le_daim

0
  • พิมพ์ประวัติและจดบันทึกหมายเลขหน้าคำสั่งที่คุณจะใช้งานและใช้งาน !number

  • นอกจากนี้คุณยังสามารถใช้! -1 (1 เป็นคำสั่งสุดท้ายที่คุณเรียกใช้แทนที่ด้วยจำนวนการนับที่คุณได้รับเมื่อคุณทำจากด้านล่างทำให้การดำเนินการครั้งสุดท้ายเป็น 1)

  • ! -2 (วินาทีสุดท้ายและต่อ ๆ ไป)

0

มีหลายเลเยอร์ที่คุณสามารถขอคำสั่งสุดท้ายได้

เครื่องมือแก้ไขบรรทัด

ตัวแก้ไขบรรทัด (ที่คุณพิมพ์คำสั่งของคุณ) มีให้โดยตรงโดย ksh, โดย readline ไลบรารี่เป็น bash, และไลบรารี่ zle ใน zsh เชลล์อื่น ๆ เช่นdash อาจไม่มีไลบรารีการแก้ไขเพื่อทำความเข้าใจกับคีย์นี้ (ยกเว้นกรณีที่คอมไพล์ด้วย--with-libeditตัวเลือกที่เปิดใช้งาน)

งานนี้ใน ksh, ทุบตี, zsh:

Ctrl- P# โหมด Emacs (ก่อนหน้า)
Ctrl- N# โหมด Emacs (ถัดไป)
ESC- k # vi โหมด ESC เพื่อไปที่โหมดคำสั่งและ k for up
ESC- j โหมด # vi ESC เพื่อไปยังโหมดคำสั่งและ j สำหรับลง

ประวัติศาสตร์

ระบบประวัติที่จัดทำโดยเชลล์จำนวนมากอนุญาตให้มีการขยายทางลัดบางอย่าง:

!!    # bash and zsh, may be provided by `alias \!\!='fc -e -'` in ksh.
!-1   # bash and zsh only

คำสั่ง

มีบางคำสั่งที่สามารถดึงคำสั่งประวัติได้

ชอบคำสั่ง verbose ค่อนข้างมาก (เพื่อพิมพ์เท่านั้น):

history 2 | head -n-1

หรือคำสั่งเก่ากว่าและมักจะเป็นfcคำสั่งแบบพกพา(เรียกใช้โดยตรงอีกครั้ง):

fc -e - -1

หรืออาจจะง่ายกว่าfc -s -1แต่ zsh ไม่ยอมรับตัวเลือกดังกล่าวสำหรับ fc

หากคุณต้องการพิมพ์เฉพาะคำสั่งให้ใช้: fc -nl -1 -1.

หากต้องการแก้ไขการตั้งค่าFCEDITการแก้ไขข้อความ (อดีตเอ็ด emacs, vi, ฯลฯ ) และใช้ fc fc -1โดยตรง:

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