Làm cách nào để quay vòng qua tìm kiếm ngược trong BASH?


443

Trong thiết bị đầu cuối, tôi có thể gõ CTRL-Rđể tìm kiếm một lệnh khớp được nhập trước đó trong BASH. Ví dụ, nếu tôi gõ CTRL-Rthì grepliệt kê greplệnh cuối cùng của tôi và tôi có thể nhấn enter để sử dụng nó. Điều này chỉ đưa ra một gợi ý mặc dù. Có cách nào để xoay vòng qua các lệnh khớp được gõ trước đó không?

Câu trả lời:


596

Nếu tôi hiểu chính xác câu hỏi, bạn sẽ có thể xoay vòng qua các lựa chọn thay thế bằng cách nhấn liên tục Ctrl+R.

Ví dụ:

Ctrl+R grep Ctrl+R Ctrl+R ...

Đó là tìm kiếm ngược thông qua lịch sử của bạn. Thay vào đó, để tìm kiếm về phía trước, hãy sử dụng Ctrl+S, nhưng bạn có thể cần phải thiết lập: stty -ixon(bằng .bash_profilehoặc bằng tay) trước đó để tắt tính năng XON / XOFF tiếp quản Ctrl+s. (Thêm chi tiết tại đây .)


23
+1 - FYI - bạn cũng có thể tìm kiếm chuyển tiếp theo câu trả lời StackOverflow này .
Jordan Arseno

7
Và sử dụng Ctrl + Shift + r để cuộn ngược lại nếu bạn tình cờ vượt qua.
khôn ngoan

19
@wiswit CTRL+SHIFT+rkhông làm việc cho tôi.
Maxim Suslov

9
@MaximSuslov Xem câu hỏi này: stackoverflow.com/questions/791765/NH Bạn có thể thêm [[ $- == *i* ]] && stty -ixonvào .bashrc của mình và sau đó CTRL+ssẽ hoạt động như ngược lạiCTRL+r
gla3dr

9
@JordanArseno Tôi lấy "tìm về phía trước" có nghĩa là "tìm kiếm các lệnh tôi chưa gõ"
Josh Johnson

234

Nếu bạn cảm thấy lệnh sẽ được sử dụng thường xuyên, bạn có thể thêm một thẻ

lệnh #usiously

Sau đó

ctrl+r #useful

Điều này hoạt động vì #là một dấu phân cách nhận xét, tức là mọi thứ xuất hiện sau ký hiệu không được hiểu là một lệnh. Tuy nhiên, nó sẽ được ghi lại trong lịch sử và do đó có thể tìm kiếm được.


5
Thông thường tôi thích loại gắn thẻ này. #trg_bld #open_log
Makesh

1
Thêm thẻ này vào đâu?
Sudip Bhandari

5
@SudipBhandari ngay sau lệnh của bạn. # bắt đầu một bình luận. Ví dụ: ls -lah #usiously
Andrei

47

Bạn cũng có thể thiết lập mũi tên lên và xuống để thực hiện tìm kiếm hơi khác bằng cách thêm các dòng này vào ~ / .inputrc:

"\e[A": history-search-backward
"\e[B": history-search-forward

Thay vì tìm kiếm một chuỗi con ở bất cứ đâu trong lệnh (như Ctrl-r ), nó sẽ tìm kiếm một lệnh bắt đầu bằng văn bản ở bên trái của con trỏ . Ví dụ: nếu tôi chạy các lệnh này:

$ ls bart
$ ls fools

sau đó nhập lsvà nhấn Uphai lần, nó sẽ hiển thị ls bartvà con trỏ ở cùng một vị trí. So sánh với Ctrl- r, nơi nó sẽ tìm thấy lshai lần trong dòng cuối cùng, vì vậy bạn phải nhấn nó một lần nữa để tìm dòng trước đó.

Những cách tiếp cận này đều có điểm mạnh của họ, và cả hai đều có thể tiết kiệm rất nhiều thời gian.


2
Đây cũng là tiêu chuẩn trên OS X, vì vậy bạn không cần phải tạo ~/.inputrcvà thêm hai dòng đó.
DASKAjA

1
Như falconepi đã viết trong các bình luận của câu trả lời này , trên Ubuntu, bạn chỉ cần bỏ ghi chú trong ~/.inputrchai dòng bao gồm tìm kiếm lịch sử- *
Arpad Horvath

Bạn cũng có thể xem bài đăng này để biết thêm chi tiết về câu trả lời này: codeinthehole.com/wr/ trên
Andrei

Đây không phải là tiêu chuẩn trên macOS của tôi (10.13). Tôi đã luôn bỏ lỡ chức năng này!
forthrin

một điều tốt về điều này là bạn vẫn có thể sử dụng ctrl-p / ctrl-n để lướt qua lịch sử thường xuyên
elig

0

Có một sự thay thế cho tích hợp được Ctrl + Rgọi là hstr . Nó cho phép tìm kiếm lịch sử lệnh khớp với tất cả các mã thông báo tìm kiếm cùng một lúc (trong số những thứ khác) và chuyển qua kết quả bằng các phím mũi tên:

Thí dụ

Đây là một bản screencast demo .

Nó có thể được cài đặt trên hệ điều hành gia đình Debian như:

add-apt-repository ppa:ultradvorka/ppa
apt-get update
apt-get install hstr

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

Và sau đó sử dụng Ctrl + R(sau khi mở lại thiết bị đầu cuối).

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.