Làm cách nào để lặp lại lệnh cuối cùng mà không sử dụng các phím mũi tên?


115

Tôi biết tôi có thể sử dụng Upđể lặp qua các lệnh trước đó. Chạy lệnh cuối cùng chỉ đơn giản liên quan đến Up+ Enter. Tuy nhiên, tôi đã nghĩ đến việc mua Bàn phím hack hạnh phúc khi tôi dành nhiều thời gian vào vim.

Bàn phím này không có phím mũi tên và cách duy nhất tôi biết cách thực hiện loại hành vi này là nhấn Ctrl+ Rvà bắt đầu lặp lại lệnh trước đó.

Có cách nào dễ dàng để mô phỏng Up+ Entertrong một thiết bị đầu cuối UNIX mà không cần các phím mũi tên không?


1
Bạn nên thay thế thẻ thiết bị đầu cuối bằng vỏ mà bạn sử dụng.
Cristian Ciupitu

2
@ illuminÉ no mouse ...
lượng

Bàn phím hack không hạnh phúc đã ngừng hoạt động năm 2006?
Peter Mortensen

@PeterMortensen không có nó vẫn có sẵn. Bạn có thể đang đề cập đến phiên bản đầu tiên, nhưng các mô hình mới hơn tiếp tục có sẵn.
lượng

Câu trả lời:


164

Với cshhoặc bất kỳ shell thực hiện csh-like lịch sử thay thế ( tcsh, bash, zsh):

!!

Sau đó Enter.


Hoặc cách khác :

!-1

Sau đó Enter.


Hoặc Ctrl+ P,Enter


Không gian kỳ diệu

Ngoài ra, lưu ý rằng !!!-1sẽ không tự động mở rộng cho bạn, cho đến khi bạn thực thi chúng (khi có thể quá muộn).

Nếu sử dụng bash, bạn có thể đưa bind Space:magic-spacevào ~/.bashrc, sau đó nhấn Spacesau khi lệnh sẽ tự động mở rộng chúng theo dòng, cho phép bạn kiểm tra chúng trước khi thực hiện. Điều này đặc biệt hữu ích cho việc mở rộng lịch sử từ một lệnh chạy cách đây một thời gian, ví dụ: !echosẽ kéo lệnh chạy cuối cùng bắt đầu bằng echo. Với không gian ma thuật, bạn có thể xem trước lệnh trước khi chạy.

Đó là tương đương với làm bindkey ' ' magic-spacetrong tcshhoặc zsh.


1
@Arman Vui mừng khi được giúp đỡ. Có rất nhiều lệnh mở rộng lịch sử; liên kết liệt kê một số trong số họ. Tôi đã chỉnh sửa một số thông tin về không gian ma thuật có thể giúp sử dụng một số trong số này.
Sparhawk

3
magic-spaceđó là một lựa chọn ngọt ngào
fduff

1
Ngoài ra còn có histverifytùy chọn shoptsẽ khiến đường dẫn thực hiện mở rộng lịch sử nhưng không thực thi lệnh trong lần nhấn đầu tiên của phím enter. Điều này sẽ cho phép bạn đánh giá kết quả và quyết định xem đó có phải là thứ bạn muốn chạy không.
Etan Reisner

2
Không bao giờ hiểu tại sao !! được sử dụng nhiều hơn CTRL-P. CTRL-P cho phép bạn xem lệnh trước khi thực hiện lệnh - và thậm chí bạn có thể sửa đổi nó. Tôi luôn cảm thấy như mình đang gieo xúc xắc với !!
abonet

1
@abonet Một cách sử dụng khác mà tôi vừa tìm thấy !!là sử dụng mở rộng tại chỗ . Ví dụ sudo !!.
Sparhawk

50

Hầu hết các shell có tính năng chỉnh sửa dòng lệnh đều hỗ trợ các ràng buộc phím Emacs. (một tập hợp nhỏ)

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

Ngoài ra, bạn có thể thiết lập trình bao của mình để sử dụng chế độ chỉnh sửa lệnh vi, bằng cách thêm set -o vivào tệp khởi động trình bao của bạn (ví dụ ~/.bashrc:). Sau đó, ví dụ, bạn có thể

  • Sử dụng EsckEnter để thực hiện lại lệnh trước đó (giống như !!). Phím trừ -cũng hoạt động như một lệnh "di chuyển lên".
  • Sử dụng EsckkkkkkkkkkkkEnter hoặc Esc12kEnter để thực hiện lại lệnh thứ 12 trước đó (giống như !-12).
  • Sử dụng Escvà một lệnh chuyển động (nghĩa là, klặp đi lặp lại một cách thích hợp), và sau đó chỉnh sửa dòng lệnh bash bạn tìm thấy ở đó. Hãy nhớ rằng, bạn sẽ vẫn có trong vichế độ lệnh, vì vậy bạn sẽ cần phải sử dụng một vilệnh chỉnh sửa (ví dụ I, A, C, R, hoặc một trong các đối tác thường của họ) để thực sự gắn với các lệnh từ lịch sử.
    Vì vậy, ví dụ, EsckisudoSpaceEntertương đương với sudo !!.
  • Đối với người dùng nâng cao: bạn thậm chí có thể sao chép văn bản ( y ank) từ một dòng và dán ( p ut) nó lên một dòng khác, để bạn có thể hoàn thành kết quả tương đương !-2:- !$. (Thật không may, nó dường như không hỗ trợ bộ đệm có tên.)

Tôi biết về mối quan hệ của emacs với thiết bị đầu cuối ... nhưng vimẹo rất hay !!!
Dox

Tôi đã nhận được deleteCtl + u trong Zsh
Timo

1
Điều này được thực hiện bởi thư viện readline. Các phím tắt khác có thể được tìm thấy trên tài liệu của nó.
Spidey

28

Yêu thích của tôi là CTRL+ Psau đó CTRL+O

Điều này hoạt động theo mặc định, không cần cấu hình thêm. ^ P sẽ cho phép bạn chuyển sang lệnh cuối cùng và ^ O sẽ cho phép bạn thực thi dòng hiện tại

Lưu ý rằng CTRL+ Ocó thể được sử dụng bao nhiêu lần bạn muốn


2
^ O không làm gì trên máy Mac của tôi.
Snowcrash

1
@Snowcrash Hãy thử^J
daisy

chỉ lặp lại một dòng trống ngay cả khi tôi đã thực hiện một lshoặc pwdtrước đó.
Snowcrash

@Snowcrash Đó là ^ P rồi ^ J ...
daisy

Ctrl + P không hoạt động trên HP-UX (Tôi không biết nó đang sử dụng trình bao nào). Cách giải quyết là gọi `zsh '.
Peter Mortensen

15

Chắc chắn rồi! Vì bạn đã quen với vikeybindings, tại sao không cấu hình shell của bạn để đáp ứng với chúng? Đối với bash, đặt điều này trong ~/.inputrc:

set editing-mode vi

Chạy các phiên bản bash sẽ không đọc lại tệp, vì vậy hãy đăng xuất và đăng nhập lại.

zshthậm chí sẽ phát hiện điều này cho bạn: nếu không có tập lệnh khởi động nào của bạn buộc chế độ chỉnh sửa theo cách này hay cách khác bằng cách sử dụng bindkey nếu $EDITORbiến môi trường của bạn được phát hiện để chứa vi, thì nó sẽ tự động kích hoạt khóa viphím. Nếu bạn cần buộc nó, hãy đặt cái này vào ~/.zshrc:

bindkey -v

Sau đó, sử dụng ESCnhư bình thường để nhập dòng lệnh kjđể di chuyển lên và xuống.

CSONG : Các ràng buộc shell mặc định trong hầu hết các shell là các ràng buộc emacs, vì vậy thực sự Crtl-PCtrl-Nsẽ hoạt động mà không cần bạn phải thay đổi bất cứ điều gì.


9

Với bất kỳ vỏ POSIX thực hiện tài năng di chuyển tùy chọn (bao gồm ksh, zsh, bash, yash), bạn cũng có thể sử dụng fclệnh:

fc -e : -1

Xem một ví dụ:

$ echo "hello"
hello

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

Thông tin thêm trong Thực thi một loạt các lệnh từ câu trả lời của lịch sử của Jonathan Leffler.


6

Đối với tất cả người dùng Mac iterm2:

Bạn có thể liên kết + Rvới 0x0C 0x10 0x0d. Điều này sẽ xóa thiết bị đầu cuối và chạy lệnh cuối cùng.

lặp 2 ưu tiên chính


Có cách nào để lặp lại lệnh cuối cùng mà không xóa thiết bị đầu cuối không?
Luke Davis

Ah, nevermind: cho bất cứ ai đọc điều này, để lặp lại mà không xóa thiết bị đầu cuối, sử dụng 0x10 0x0d(tức là bỏ qua 0x0C).
Luke Davis

5

Tôi thấy tôi cần làm lại các lệnh như siêu người dùng thường xuyên, vì vậy

sudo !!

làm lại lệnh trước như thể tôi đã nhớ gõ sudoở vị trí đầu tiên.


2
Tôi thực sự thích điều này, cũng có vẻ như là một phản ứng tốt với "ủy quyền bị từ chối". "Tôi có nghĩa là sudo ffs!"
Viktor Mellgren

3

Các kshvỏ có một bí danh mặc định rlặp lại lệnh gần đây nhất. Nó nhất định là fc -s:

alias r='fc -s'

Thật thú vị, bashtài liệu cho fcnội dung dựng sẵn ( help fcvà cả trong hướng dẫn sử dụng) thậm chí còn đề cập đến điều này, nhưng nó không phải là bí danh mặc định trong vỏ đó:

Một bí danh hữu ích để sử dụng với điều này là r='fc -s', để việc gõ r cc chạy lệnh cuối cùng bắt đầu bằng ccvà gõ rlại thực hiện lệnh cuối cùng.

Trong bash, điều này cũng sẽ hoạt động ngay cả khi bạn đã tắt mở rộng lịch sử set +H.

Trong zshshell, có một rnội dung được ghi lại giống như fc -e -.

Các fctiện ích là một tiêu chuẩn tiện ích POSIX .


2

Với cshhoặc bất kỳ shell thực hiện csh-like lịch sử thay thế ( tcsh, bash, zsh), bạn cũng có thể sử dụng !<beginning of command>để gọi lệnh cuối cùng bắt đầu với <beginning of command>.

ví dụ nếu bạn chạy

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

!ta sẽ thực thi tail file.txt


1

tl; dr !!chỉ nối thêm lệnh cuối cùng vào lệnh hiện tại của bạn. <backtick>!!<backtick> thực thi lệnh cuối cùng và nối đầu ra vào lệnh hiện tại của bạn.

Thực tế có 2 biến thể:

  1. Lệnh cuối cùng
  2. Kết quả của lệnh cuối cùng

Để tôi chỉ cho bạn 2 ví dụ:

ví dụ 1

$ mkdir /test
mkdir: /test: Permission denied

$ sudo !!
sudo mkdir /test
Password:

Như bạn thấy ở trên, tôi đang thực thi một lệnh và về cơ bản chỉ là nối thêm lệnh cuối cùng.

Một biến thể khác

Ví dụ 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 cho vi `!!`. Rất hữu ích
le_daim

0

Khi tôi đang sử dụng một trình giả lập xterm tốt, ví dụ: putty, cách ưa thích của tôi để tiến hành là chọn lệnh bao gồm nguồn cấp dữ liệu, sao chép nó vào clipboard và sau đó sử dụng nhấp chuột phải để dán. Điều này lặp lại lệnh trong một cú nhấp chuột duy nhất. Điều này cũng hoạt động tốt cho một chuỗi các lệnh được phân tách bằng dấu chấm phẩy.


0

bạn có thể sử dụng !nđể thực thi lệnh thứ n trong terminal. trong đó 'n' là dòng không có historylệnh.


Vỏ nào mở rộng !?đến lệnh cuối cùng? Bạn có chắc chắn rằng bạn không trộn lẫn với nó !!(đã được đề cập trong các câu trả lời khác)?
Anthony Geoghegan

xin lỗi, thực sự tôi đã thử nghiệm lệnh này tại thời điểm đó. vui lòng kiểm tra câu trả lời chỉnh sửa. @AnthonyGeoghegan
Ravi Sevta

Đây là lối tắt tôi đang tìm kiếm. Cảm ơn!
le_daim

0
  • Nhập Lịch sử và ghi chú số trước lệnh mà bạn thực hiện và sử dụng !number

  • Bạn cũng có thể sử dụng ! -1 (1 là lệnh cuối cùng bạn thực hiện, thay thế nó bằng số đếm mà bạn nhận được khi thực hiện từ bên dưới, giữ lệnh cuối cùng được thực hiện là 1)

  • ! -2 (giây cuối cùng và vv)

0

Có một số lớp trong đó bạn có thể yêu cầu lệnh cuối cùng.

Biên tập dòng

Trình chỉnh sửa dòng (nơi bạn nhập lệnh của bạn) được cung cấp trực tiếp bởi ksh, bởi đường dẫn thư viện trong bash và bởi thư viện zle trong zsh. Các shell khác, như dash có thể không có thư viện chỉnh sửa để hiểu các khóa này (trừ khi được biên dịch với --with-libedittùy chọn được bật).

Công việc này trong ksh, bash, zsh:

Ctrl- PChế độ # Emacs (trước)
Ctrl- NChế độ # Emacs (tiếp theo)
ESC- k # vi chế độ ESC để chuyển sang chế độ lệnh và k để lên
ESC- j # vi chế độ ESC để chuyển sang chế độ lệnh và j cho xuống

lịch sử

Hệ thống lịch sử được cung cấp bởi nhiều hệ vỏ cho phép mở rộng một số phím tắt:

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

lệnh

Có một số lệnh có thể truy xuất các lệnh lịch sử.

Giống như lệnh khá dài dòng (chỉ để in):

history 2 | head -n-1

hoặc lệnh cũ hơn và do đó thường di động hơn fc(trực tiếp thực hiện lại):

fc -e - -1

Hoặc có thể đơn giản hơn fc -s -1, nhưng zsh không chấp nhận tùy chọn như vậy cho fc.

Nếu bạn muốn chỉ in lệnh, sử dụng : fc -nl -1 -1.

Để chỉnh sửa, hãy đặt thành FCEDITtrình soạn thảo văn bản (ví dụ: ed, emacs, vi, v.v.) và sử dụng trực tiếp fc : fc -1.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.