Tìm kiếm một lệnh trước đó với tiền tố tôi vừa gõ


67

Chúng ta có thể sử dụng mũi tên lên và xuống để điều hướng trong lịch sử lệnh.

Trong một số IDE, chẳng hạn như Matlab, nếu chúng ta nhập một cái gì đó và sau đó nhấn các phím mũi tên, chúng ta chỉ cuộn giữa các lệnh lịch sử bắt đầu với những gì chúng ta có đầu vào. Điều đó thực sự tiện lợi, nhưng trong một thiết bị đầu cuối vỏ, điều này không hoạt động.

Có cách nào để đạt được một chức năng tương tự trong một thiết bị đầu cuối shell? Và bất kỳ lời khuyên khác để cải thiện hiệu quả trong việc sử dụng thiết bị đầu cuối?


Bạn chỉ có thể sử dụng một vỏ cung cấp một tính năng như vậy, như fish;)
yoann

@yoann bạn đang giả sử bash không. Nó không, thông qua readline, chỉ không thể truy cập theo mặc định.
muru

@muru Tôi biết về CTRL + R trong bash và câu trả lời của egmont cung cấp một cách gọn gàng để làm điều đó với Page Up / Page Down. Tuy nhiên, có cách nào để làm như vậy với các phím mũi tên?
yoann

1
@yoann kiểm tra unix.stackexchange.com/a/76591/70524 . Thay vì \e[5~\e[6~, sử dụng \e[A, \e[B.
muru

Câu trả lời:


95

Những gì bạn đang tìm kiếm là CtrlR.

Nhập CtrlRvà sau đó nhập một phần của lệnh bạn muốn. Bash sẽ hiển thị lệnh khớp đầu tiên. Tiếp tục gõ CtrlRvà bash sẽ chuyển qua các lệnh khớp trước đó.

Để tìm kiếm ngược trong lịch sử, nhập CtrlSthay thế. (Nếu CtrlSkhông hoạt động theo cách đó cho bạn, điều đó có thể có nghĩa là bạn cần phải tắt điều khiển luồng XON / XOFF: để làm điều đó, hãy chạy stty -ixon.)

Điều này được ghi lại trong phần "Tìm kiếm" trong man bash.


1
Ctrl-Qđể thoát khỏi trạng thái đóng băng, nếu bạn đã nhấn Ctrl-Smà không tắt điều khiển luồng trước và thiết bị đầu cuối của bạn bị đóng băng.
HongboZhu

26

Đặt chúng trong ~/.inputrc:

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

Những điều này làm Page UpPage Downhành xử như bạn muốn. (Một số bản phân phối đã cấu hình nó cho bạn.) Cá nhân tôi thấy những cách này thuận tiện hơn Ctrl+ Rhoặc history.


Đây là cách thuận tiện nhất trong tất cả các câu trả lời hiện tại. Bạn có thể giải thích một chút về cơ chế làm việc không?
Lee

3
~/.inputrchoặc /etc/inputrchoặc tệp được tham chiếu bởi biến môi trường $INPUTRClà tệp cấu hình chỉnh sửa dòng của tất cả các ứng dụng bằng cách sử dụng readline, bao gồm bash (shell của bạn). Nó có một số khả năng chỉnh sửa dòng tích hợp nhất định, bao gồm cả hai: trong tìm kiếm trang thủ công của bash cho một trong những từ khóa này để tìm hiểu thêm. \e[5~/ \e[6~là các chuỗi thoát được tạo bởi các phím Page Up / Down trong hầu hết các trình giả lập thiết bị đầu cuối; để xem nó, khởi chạy catlệnh và sau đó nhấn các phím này (byte thoát được biểu diễn trong terminal dưới dạng ^[, trong inputrc as \e).
egmont

Ví dụ trong câu hỏi ban đầu của bạn nói rằng các phím Lên / Xuống hoạt động theo cách này trong Matlab. Sẽ rất thú vị để xem điều gì đã xảy ra nếu bạn đặt chuỗi Lên và Xuống trong inputrc và gán cho hành động này; nó sẽ hoạt động chính xác, hoặc có tác dụng phụ khó chịu khi nó xung đột với hành vi mặc định của họ. Tôi không biết, tôi rất vui khi nghe những phát hiện của bạn nếu bạn thử nghiệm điều này.
egmont

Khi tôi làm echo $INPUTRCnó trống rỗng. Tôi đang sử dụng Ubuntu 14.04
JorgeeFG

2
Cá nhân tôi thích ghi đè mũi tên lên và xuống để làm điều này: "\e[A": history-search-backward"\e[B": history-search-forward
A.Wan

9

Ngoài lịch sử ^ r / ^ s i-search:

alt.chèn "từ" cuối cùng của lệnh trước vào con trỏ. Lặp lại nó để có được từ cuối cùng từ các lệnh cũ hơn. (Nhưng lưu ý rằng một dấu vết &được tính là từ cuối cùng cho các lệnh nền).

Điều này là siêu tiện dụng cho mkdir foo, cdalt-dot. Thậm chí nhanh hơn mũi tên lên, ^ a, alt-d (xóa từ chuyển tiếp) , cd.

Để có được từ thứ 2 đến cuối cùng, hãy sử dụng esc - 2 alt+.(nghĩa là sử dụng một đối số số theo kiểu emacs để alt+.. Đếm âm tính từ cuối, tích cực chuyển tiếp từ đầu.) Nhưng điều này thường rắc rối hơn giá trị của nó; tại một số điểm, nó nhanh hơn để lấy chuột và sao chép / dán, hoặc mũi tên lên và ^ w / ^ y một phần của nó (xem bên dưới).


Nếu thiết bị đầu cuối của bạn được thiết lập độc đáo / đúng cách, ctrl-trái và ctrl-phải sẽ đi lùi / chuyển tiếp bằng lời nói. Nếu không, hy vọng ít nhất alt-b và alt-f sẽ làm điều tương tự.


ctrl- / là một hoàn tác. Bạn có thể sử dụng tự động lặp lại để xóa các từ hiệu quả hơn nhiều nếu bạn có thể hoàn tác khi bạn vượt quá một chút.


Việc trộn / kết hợp các lệnh mạnh mẽ hơn đến từ việc sử dụng kill-ring, hoạt động giống như trong Emacs. ctrl-y để dán ctrl-w / ctrl-u / ctrl-backspace / alt-d cuối cùng. alt-y để chuyển qua văn bản cũ bị giết.

Nhiều ctrl-w hoặc bất cứ thứ gì liên tiếp tạo ra mục nhập vòng kill. Sử dụng mũi tên trái và phải hoặc một cái gì đó để phá vỡ mục nếu bạn muốn loại bỏ hai thứ và chỉ dán một cái sau đó.

Kết hợp tất cả những thứ này lại với nhau, bạn có thể

  • bắt đầu gõ một lệnh
  • ctrl-r để quay lại một lệnh cũ và lấy một phần của nó bằng control-w hoặc tương tự.
  • esc-r hoặc alt+rđể khôi phục nó về trạng thái như trước khi bạn xóa một phần của nó.
  • alt- >để đi đến cuối lịch sử (tức là mũi tên xuống hết cỡ), để quay lại lệnh bạn đang ở giữa.

Các mẹo sử dụng tương tác khác:

Cho phép shopt -s globstar, vì vậy bạn có thể làm **/*.c(đệ quy bao gồm cả thư mục hiện tại). Đôi khi tiện dụng để sử dụng tương tác, nhưng thường find -name '*.c' -exec foo {} +là tốt hơn.

Nếu bạn viết tập lệnh bash, bạn cũng sẽ thấy thuận tiện khi shopt -s extglobbật trình tương tác của mình. Đôi khi bạn sẽ tìm thấy cách sử dụng cho những thứ như *.!(c|h)khớp với các tệp không kết thúc bằng .c hoặc .h.

Tìm bí danh bạn muốn cho ls -l, lessvà bất cứ điều gì khác mà bạn làm được rất nhiều. ( cp -i, mv -irm -Ilà tốt đẹp. Đừng có thói quen phụ thuộc vào họ để thực hiện một rm chọn lọc. GNU rm's -I yêu cầu một lần cho tất cả các đối số.)

Tôi thích alias m=less(m cho "thêm"). Tôi đã lessthiết lập ,.ràng buộc với tập tin trước đó / tiếp theo ( lesskey). Mặc định là một chuỗi nhiều phím không thể được sử dụng với autorepeat.


Tôi thích làm mọi thứ trong màn hình GNU. Tôi thấy việc theo dõi các cửa sổ màn hình được đánh số dễ dàng hơn so với một lượng lớn các tab trong Konsole (hoặc bất kỳ trình giả lập thiết bị đầu cuối nào khác mà tôi đã thử). Nếu bạn chưa biết screen, hãy học tmux vì nó mới hơn và ít bị hỏng hơn.

Để có được thứ gì đó giống như chức năng mở shell mới với cùng cwd với shell khác, tôi sử dụng hook tùy chỉnh cho cd / pushd / popd cho phép tôi thực hiện cds 8cd vào bất cứ thứ gì mà shell của tôi trong cửa sổ màn hình 8 đang sử dụng. Điều này hoạt động ngay cả đối với các shell bên ngoài phiên màn hình, miễn là chỉ có một phiên màn hình.


Của tôi dường như không được "cấu hình đúng". Rất nhiều phím tắt tôi thấy ở đây không hoạt động, tôi đang sử dụng Terminal Terminal từ Ubuntu 14.04. Làm thế nào tôi có thể cấu hình nó?
JorgeeFG

@JorgeeFG: Tôi nghĩ rằng nó hoạt động tốt với tôi gnome-terminaltrong Ubuntu 14.04, trước khi tôi chuyển sang KDE. Tùy chọn có liên quan nằm trong cài đặt thiết bị đầu cuối của bạn, esc-prefix so với high-bit và có thể một số cài đặt khác. Một số trong số họ không hoạt động hoàn hảo cho tôi thông qua ssh. (ví dụ: ctrl trái / phải lấy mã thoát cho phím mũi tên và tôi sẽ 5Dxuất hiện theo nghĩa đen)
Peter Cordes

7

Thêm các dòng sau vào ~/.inputrc

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

Điều này tương tự như câu trả lời của egmont, nhưng thay vì sử dụng Page Up và Page Down, nó sử dụng các chuỗi thoát cho Arrow Up và Arrow Down. Cách này thuận tiện hơn nhiều khi sử dụng trên máy Mac.


4

Tôi luôn có xu hướng định cấu hình các máy của mình với giá trị HISTSIZE lớn để nó giữ danh sách lịch sử dài hơn, cũng như HISTTIMEFORMAT với giá trị tem thời gian để tôi có thể biết khi nào lệnh được chạy.

export HISTSIZE=10000
export HISTTIMEFORMAT="%m/%d/%Y %T "

3

Phương tiện tôi thường sử dụng là kết hợp historylệnh vớigrep

I E:

history | grep <command im looking for>

Điều đó sẽ hiển thị một lịch sử được đánh số của các lệnh bạn đã nhập có chứa lệnh đó, sau đó bạn có thể sử dụng:

!<number listed in history command>

để làm lại lệnh đó.

I E:

history | grep history

142  history
143  history | grep lvresize
568  history | grep echo
570  history | grep echo
571  history | grep history

theo dõi bởi: !571

sẽ lặp lại history | grep history


1
CR = tốt hơn nhiều + an toàn hơn nhiều
PSkocik

1
Có lẽ, cá nhân tôi thấy một lịch sử được chuyển sang grep là một phương tiện nhanh hơn để tìm ra hầu hết các lệnh. Theo như An toàn hơn, tôi không chắc ý của bạn là gì, những rủi ro cố hữu trong việc sử dụng lịch sử như được áp dụng để tìm kiếm thông qua cR là gì?
Gravy

2
@Gravy Tôi nghi ngờ PSkocik có nghĩa là sự !thay thế lịch sử là ít an toàn.
derobert

3
@Gravy Những rủi ro cố hữu sẽ vô tình nhận sai dòng. Không biết tại sao thiết bị đầu cuối của bạn bị đóng băng, trừ khi bạn sử dụng Control-S và bạn đã bật điều khiển luồng xon / xoff (thường là mặc định). Nếu vậy, Control-Q sẽ mang nó trở lại.
derobert

1
Tôi đồng ý với @PSkocik, cr tốt hơn nhiều vì việc chỉnh sửa dòng lịch sử dễ dàng hơn thay vì chỉ chạy lại theo cùng một cách. Chạy lại lệnh chính xác giống nhau là một trường hợp tầm thường về những gì bạn có thể làm để tiết kiệm thời gian gõ lại các biến thể trên một lớp lót phức tạp hoặc hoàn thành một tệp khác trong một đường dẫn dài. Xem câu trả lời của tôi.
Peter Cordes

1

Tôi đã sử dụng 4 mẹo hàng ngày (và một số mẹo khác) trong thiết bị đầu cuối bash của mình:

  • Thực hiện lệnh cuối cùng: !!

  • Thực hiện lệnh N từ lịch sử: !N

  • In lệnh cuối cùng bắt đầu bằng tiền tố từ lịch sử: !prefix:p

  • Thực hiện lệnh cuối cùng bắt đầu bằng tiền tố từ lịch sử: !prefix


1

Nếu bạn đồng ý sử dụng zshthay vì bashbạn thì hãy sử dụng oh-my-zsh cho việc đó.

Nó chứa mũi tên hướng xuống xuống thông qua lịch sử lệnh của bạn. Nó cũng cho phép điều hướng tương tự khi bạn đã gõ văn bản (như Mathlab).

chỉnh sửa: Nó cũng chứa các nội dung tập trung vào nhà phát triển khác, chẳng hạn như bí danh và chủ đề. Các tính năng bổ sung làm cho bản phân phối lớn hơn và phức tạp hơn để sử dụng.

https://github.com/robbyrussell/oh-my-zsh


1
oh-my-zshchứa hàng tấn thứ. Bạn cũng có thể nói: Tính năng chính xác này được bao gồm trong bản phân phối đó, khi tất cả những gì bạn cần là một cài đặt hoặc ứng dụng cụ thể.
muru

Tôi đã chỉnh sửa bài đăng: Tôi đã cảnh báo rằng nó lớn hơn một ứng dụng đơn giản.
user9869932

1

Thêm bí danh sau vào ~ / .bashrc

alias h='history | awk '"'"'{$1="";print}'"'"' |sed "s/^ *//" |grep -v "^h " | sort | uniq | grep'

Cách sử dụng: h firesẽ cho tôi một danh sách các lệnh chứa lửa . hoặc h ^firesẽ cho tôi một danh sách các lệnh bắt đầu bằng lửa .

Điều này hữu ích khi tôi muốn xem một loạt các lệnh cùng một lúc.

Nhân tiện, '"'"'thật xấu xí nhưng tôi không thể tìm ra những cách khác để tránh những trích dẫn đơn trong những trích dẫn đơn.


fyi - h="history | awk '{\$1=\"\"; print}'nên làm việc. thay thế tạo ra một chức năng và gọi đó.
DarkHeart

cảm ơn DarkHeart, nhưng tôi đã thử mã của bạn, thấy không hoạt động trong môi trường của tôi, có thể có một cái gì đó khác biệt trong tôi
Hosi Golden
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.