Cách tốt nhất để tìm kiếm trong lịch sử của shell


78

Có cách nào tốt hơn để tìm kiếm tệp lịch sử của tôi cho một lệnh hơn grep không? Tôi có một số ý tưởng về lệnh bắt đầu như thế nào, nhưng tôi không biết nó đã lùi xa bao nhiêu trong lịch sử.

update: trước đây là zsh cụ thể nhưng do các câu trả lời chồng chéo, vui lòng trả lời cho bất kỳ shell (hoặc chế độ (vi / emacs)) nào ở đây, chỉ cần lưu ý nếu nó cụ thể.

Câu trả lời:


73

Ctrl+ Rthường là cách tốt nhất, như mô tả đã nói . Bạn cũng có thể sử dụng !string, chạy lệnh gần đây nhất bắt đầu bằng stringhoặc !?string?chạy lệnh gần đây nhất có chứa string.

(Tôi nghĩ đó là điều duy nhất có liên quan đến câu hỏi này, nhưng tôi đã đề cập nhiều hơn về các lệnh lịch sử trong câu trả lời này )


4
Làm thế nào để bạn làm cho 'ctrl + r' trông như thế?
xenoterracide

13
@xen <kbd>Ctrl+R</kbd>. nguồn trả lời
Michael Mrozek

Tôi đã không nhận ra công cụ SE chấp nhận bất kỳ html nào.
xenoterracide

Tôi không biết rằng từ khóa kbd sẽ diễn giải chính xác "ctrl" và "+"! Tôi đã sử dụng để gắn thẻ từng khóa riêng biệt. cảm ơn!
Olivier Dulac

2
@OlivierDulac Đáng buồn thay, đó không phải là cách tôi sử dụng để định dạng khóa; ai đó đã chỉnh sửa câu trả lời của tôi sau đó để biến chúng thành các khóa riêng biệt
Michael Mrozek

30

Khi sử dụng Bash, gõ Control- Rvà sau đó bắt đầu nhập. Gõ Control- Rlặp đi lặp lại sau khi nhập một số văn bản sẽ đưa bạn trở lại trong các dòng lệnh phù hợp.


18

Không chắc chắn nếu điều này sẽ giúp, nhưng tôi thích sử dụng ctrl- rvà sau đó bắt đầu gõ lệnh. Nó sẽ đi qua lịch sử của bạn và giới thiệu bạn với trận đấu đầu tiên. Để chuyển qua các trận đấu chỉ cần nhấn ctrl- rmột lần nữa.


2
Xin lỗi, quên về zsh. Bạn có thể phải thêm liên kết phím này vào ~ / .zshrc: bindkey '^ R' history-tăng dần-tìm kiếm-lùi của nó
giải mã

17

Nếu bạn thêm vào như sau ~/.inputrc

"\e[5~": history-search-backward
"\e[6~": history-search-forward

và khởi động lại Bash, bạn có thể bắt đầu nhập, sau đó sử dụng Page UpPage Downđể di chuyển lùi và tiến qua lịch sử của các dòng bắt đầu với cùng một tiền tố bạn vừa nhập.

(Một số có thể thích sử dụng \e[A\e[B, sẽ thay thế bình thường UpDownhành động thay vì ràng buộc các khóa mới.)


Tôi thích ánh xạ các lệnh này đến Alt + UpAlt + Down. Tùy thuộc vào mô phỏng bàn phím, mô phỏng thiết bị đầu cuối sử dụng các kết hợp này có thể được ánh xạ tới \E[A\E[A(ví dụ: KDE Konsole với Linux Key Bindings) hoặc \E[1;3A\E[1;3B(ví dụ XFCE Terminal hoặc KDE Konsole với X Free 4 Bindings).
Christian Herenz

9

Dấu nhắc tương tác được gọi bởi Ctrl- R, đã được đề cập, là cách thuận tiện nhất. Ngoài ra, nó phổ biến để ánh xạ lại UpDowncác phím mũi tên để tìm kiếm lịch sử cho tiền tố hiện tại trên dòng lệnh, tuy nhiên điều này đòi hỏi một số thay đổi đối với ~/.inputrctệp .

Giải pháp cổ điển và ít tương tác là sử dụng mở rộng lịch sử shell. Đánh máy

!foo

sẽ thực thi lệnh cuối cùng bắt đầu bằng foo

!?foo

sẽ thực thi lệnh cuối cùng có chứa foo. Thông tin thêm về mở rộng lịch sử có thể được tìm thấy trong hướng dẫn tham khảo Bash , giả sử vỏ của bạn là Bash hoặc tương thích.


6

Nếu bạn thêm stty -ixonvào ~/.bashrctệp của mình thì Ctrl- ssẽ đi theo hướng ngược lại với Ctrl- r.


Tôi muốn sử dụng C-scho mục đích này, nhưng thiết bị đầu cuối của tôi đã bị đóng băng ; coi chừng (Chà, tôi chưa làm việc gì cả stty ixon, không chắc cái này để làm gì.)
imz - Ivan Zakharyaschev

3
@imz: C-qsẽ "giải tỏa". Nó và C-slà các ký tự điều khiển luồng phần mềm thông thường đã từng hữu ích để ngắt thủ công (tạm dừng) luồng đầu ra khi các kết nối nối tiếp chậm được sử dụng. Bây giờ đầu ra rất nhanh trong hầu hết các trường hợp mà những gì bạn muốn thấy khi bạn nhấn C-sđã được cuộn qua. stty -ixontắt điều khiển luồng phần mềm.
Dennis Williamson

Tuyệt vời! Tôi đã tìm kiếm trong nhiều năm để tìm cách di chuyển về phía trước trong lịch sử như thế này.
tuyên bố

3

Nếu bạn gõ !lsthì bash sẽ xem qua lịch sử của bạn và thực hiện lệnh gần đây nhất bắt đầu bằng "ls"


2

có thể là zsh cụ thể. Khi nghiên cứu câu trả lời này, tôi đã tìm thấy vi-history-search-backward cho phép một người tìm kiếm /ở chế độ vi (mà tôi không đề cập đến tôi đang ở), sau đó bạn có thể sử dụng nNtìm kiếm tiến và lùi tương ứng (sau khi nhấn enter).


2

Tôi ngạc nhiên khi điều này chưa được đề cập - nhưng bạn có thể chọn chế độ vi trong bash hoặc ksh bằng cách thực hiện:

set -o vi

... hoặc sử dụng nội dung này làm nội dung của ~/.inputrc(đối với đường dẫn GNU được sử dụng trong các chương trình như bash):

set editing-mode vi

Sau đó, bạn có thể sử dụng Escđể vào chế độ lệnh và sử dụng kđể quay lại lịch sử và jtiếp tục. Bạn cũng có thể tìm kiếm bằng cách /tìm kiếm bình thường và ?tìm kiếm ngược lại.

Nếu bạn sử dụng ~/.inputrc, thì nó sẽ hoạt động không chỉ trong bash GNU mà trong bất kỳ thứ gì sử dụng đường đọc GNU như CLISP và có thể các chương trình như shell lệnh MySQL và như vỏ CPAN.


2

Để chuyển tiếp khi sử dụng tìm kiếm ngược (với lệnh Ctrl-R):

  1. Mở tệp .bashrc của bạn:
    sudo gedit ~/.bashrc

  2. thêm dòng này (chữ "f" có thể được thay thế bằng dòng khác chưa được sử dụng bởi hệ thống)

    bind '"\C-f": forward-search-history' 
  3. Đóng tệp của bạn và cập nhật .bashrc (hoặc mở một thiết bị đầu cuối khác) bằng lệnh:
    source ~/.bashrchoặc. ~/.bashrc

NGAY BÂY GIỜ BẠN CÓ THỂ CHUYỂN ĐỔI TRONG LỊCH SỬ VỚI SHORTCUT: Ctrl + f

Làm việc trên Ubuntu 18.04 LTS


1

Tôi sử dụng sau hai phần lớn thời gian.
Nhưng xin lưu ý rằng cả hai đều tìm kiếm ký tự bắt đầu.

  1. tcsh : gõ một vài charecters của lệnh sau đó Esc+ pnó sẽ hiển thị lệnh trước đó bắt đầu bằng chuỗi phím đó nhấn nó một lần nữa nó sẽ hiển thị một lệnh khác.
  2. ksh : sử dụng fc -e - <SPACE> <first few char for your previous >cái này sẽ chạy lệnh cuối cùng khớp với chuỗi đó.

Tôi đã không thể tìm thấy một cái gì đó như Ctrl+ Rtrong Bash cho ksh và tcsh của tôi.


3
Ctrl + r hoạt động hơi khác một chút trong ksh so với Bash. Nhấn Ctrl + r sau đó nhập chuỗi bạn đang tìm và nhấn enter . Để tìm kiếm điều tương tự, nhấn Ctrl + r và nhập mà không cần phải nhập lại chuỗi. Nhân tiện, đây là trong set -o emacschế độ.
Dennis Williamson

@Dennis: +1 :-)
Hemant

1

Có một cách để sử dụng Ctrl- Rvới tcsh . Thêm vào đây trong ~/.cshrc:

bindkey "^r" i-search-back (nó chỉ là một dấu hiệu dấu mũ và chữ r)

Đó là tiết kiệm thời gian lớn nhất đối với tôi.


1

câu trả lời tương tự với @ephemient, nhưng bạn có thể đưa vào .bashrc của mình

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

và nhập một phần của cụm từ, sau đó sử dụng mũi tên lên / xuống để duyệt các tùy chọn gần đây nhất phù hợp. Đây là hành vi mặc định của matlab.

Đối với hầu hết mọi người, nếu bạn muốn chuyển các thiết lập của mình sang một hệ thống mới, việc nhớ lại chỉ là của bạn sẽ dễ dàng hơn đến ~/.bashrcmức bạn phải bỏ qua điều đó~/.inputrc


0

Có nó tồn tại, ít nhất là nếu bạn đang sử dụng zsh. Chỉ cần bắt đầu nhập lệnh và sau đó nhấn M-p( ESC p) và nó sẽ tìm thấy các lệnh trước đó khớp với những gì bạn đã nhập. Nhấn nó một lần nữa để tìm trận đấu tiếp theo.


Câu trả lời này có thể làm với nhiều lời giải thích.
phunehehe
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.