Tìm kiếm lịch sử Bash, một phần + mũi tên lên


146

Tôi đã tìm kiếm, nhưng không tìm thấy bất cứ điều gì về điều này. Tôi đang tìm kiếm một chức năng trong bash, sử dụng một thiết bị đầu cuối.

Quay trở lại khi, tôi có một người dùng trên hệ thống debian và một người bạn đã thiết lập cho tôi một tính năng tìm kiếm lịch sử thuận tiện (tôi tin rằng tôi đã sử dụng tcsh sau đó), trong đó tôi sẽ gõ đầu lệnh trước đó, nhấn mũi tên lên, và nó sẽ thực hiện tìm kiếm, dựa trên chuỗi một phần.

Ví dụ: nếu lịch sử của tôi là:

./script.pl
./script.pl arg1
cat output
cat output | grep yada

Và tôi gõ ., và nhấn mũi tên lên, nó sẽ hiển thị cho tôi : ./script.pl arg1. Nhấn lại lần nữa và nó sẽ hiển thị ./script.pl, v.v.

Rất giống như nó sẽ thực hiện một grep.bash_history. Có cách nào để có được chức năng này?



1
@Marcel Có vẻ như đó có thể là cùng một câu trả lời, tôi đã thấy điều đó trong tìm kiếm, nhưng không kết nối nó với câu hỏi của tôi, với các từ khóa iPython và Shell.
TLP

Âm thanh như thế này - github.com/zsh-users/zsh-autosuggestions .
slm

Câu trả lời:


197

Đặt các dòng sau vào ~/.inputrc:

## arrow up
"\e[A":history-search-backward
## arrow down
"\e[B":history-search-forward

Dòng bắt đầu với #ý kiến. Tôi không thể nhớ những gì là lạc hậu và những gì về phía trước. Thử nghiệm với nó. Có lẽ bạn phải chuyển đổi lùi và tiến.


Một chút thông tin cơ bản:

Bash đang sử dụng readline để xử lý dấu nhắc. ~/.inputrclà tập tin cấu hình cho readline. Lưu ý rằng điều này cũng sẽ có hiệu lực trong phần mềm khác bằng thư viện readline, ví dụ IPython .

Đọc hướng dẫn bash để biết thêm thông tin về readline. Ở đó bạn cũng có thể tìm thấy nhiều lệnh đọc lịch sử liên quan hơn .

Để lấy mã thoát cho các phím mũi tên, bạn có thể làm như sau:

  1. Bắt đầu cattrong một thiết bị đầu cuối (chỉ cat, không có thêm đối số).
  2. Nhập các phím trên bàn phím, bạn sẽ nhận được những thứ như ^[[Amũi tên lên và ^[[Bmũi tên xuống.
  3. Thay thế ^[bằng \e.

1
Tuyệt vời, nhưng giải pháp này vô hiệu hóa các phím tắt ctrl-left / ctrl-right.
Mắt

Ai đó có thể cho tôi biết làm thế nào tôi có thể đạt được điều tương tự để thực hiện không
Hitesh Kumar

@lesmana, tôi sẽ cho thêm điểm cho phần mèo một mình
Mike D

Thứ hai @Eyal, có ai có lời khuyên về cách tôi có thể có cái này nhưng bảo toàn các phím tắt ctrl-left / ctrl-right không?
kbrose

6
Để duy trì tất cả các mặc định thêm $include /etc/inputrc, tốt nhất là trên dòng đầu tiên.
Tulio Casagrande

31

Tạo một tệp có tên setup_readline.sh với chế độ 644 trong /etc/profile.d/ với nội dung sau, đăng nhập và kiểm tra các khóa ưa thích của bạn:

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

Tôi nghĩ là cách tốt nhất để làm điều này. Chủ yếu là nếu bạn sử dụng các hệ thống quản lý cấu hình như đầu bếp, con rối, v.v.

Và cấu hình hệ thống vẫn còn nguyên!


4
Điều kỳ lạ là ~ / inputrc không hoạt động với tôi - nhưng việc đưa các lệnh này vào .bash_profile thì có.
Joe

1
.inputrc không tồn tại trong thư mục nhà của tôi và tôi thích có các loại cài đặt này trong .bashrc hơn nữa vì vậy tôi chỉ có thể mang theo một tệp cho các cài đặt của mình. Vì vậy, đây có lẽ là một câu trả lời tốt hơn sau đó chấp nhận một.
Shital Shah

.inputrc hoạt động tuyệt vời cho tôi, nhưng không phải sau khi tôi tải screen. Điều kỳ lạ là, các phím tắt .inputrc khác hoạt động, nhưng không phải là các phím tắt này. Vì vậy, tôi sử dụng cả hai giải pháp bây giờ.
Orwellophile

Điều này cực kỳ hữu ích khi, ví dụ, bạn đăng nhập vào máy chủ để thực hiện mọi việc và đang bỏ lỡ những thứ này và không muốn chỉnh sửa và tải lại ~ / .inputrc trên máy chủ.
danmactough

13

Ctrl + R sẽ cung cấp cho bạn loại chức năng này. Bắt đầu nhập một phần lệnh và nó sẽ xuất hiện những lệnh cũ mà bạn có thể điều hướng bằng mũi tên lên và xuống. Thông tin thêm: http://www.nuxified.org/blog/ctrl_r_in_the_bash_shell


2
Cảm ơn vì đã trả lời. Vâng, tôi đã thử điều đó, nhưng tôi thấy nó hơi ... khó hiểu. Nó sẽ không cho phép tôi cuộn qua các lệnh bắt đầu bằng một phần, nó chỉ hiển thị đầu tiên. Nó cũng tìm kiếm toàn bộ lệnh cho nhân vật, đó là loại vô dụng.
TLP

5
@TLP, lặp lại đánhCtrl+r
akostadinov

4

Để hoàn thành câu trả lời của lesmana về "~ / .inputrc" mà tôi nên tạo theo Trusty 14.04, hãy xác minh / thêm vào "~ / .bashrc" (dòng đầu tiên đã tồn tại trong "~ / .bashrc") của tôi:

shopt -s histappend  
PROMPT_COMMAND='history -a'  

Nó đã được giải thích bằng tiếng Pháp trong https://doc.ubfox-fr.org/terminal?&#pour_completer_les_commandes_a_partir_de_l_historique .


2
Lệnh này về cơ bản hướng dẫn bash để ngay lập tức nối lệnh vào tệp lịch sử thay vì chờ phiên kết thúc. Nó hữu ích nếu bạn có nhiều thiết bị đầu cuối mở và không muốn mất lịch sử trong một nhưng nếu không thì không cần thiết. digitalocean.com/community/tutorials/ từ
Shital Shah

3

Có lẽ bạn có thể muốn thử https://github.com/dvorka/hstr cung cấp tính năng lọc lịch sử Bash đơn giản và đa dòng dựa trên số liệu (thời gian, tần suất và độ dài của các vấn đề) - bạn có thể sử dụng các phím mũi tên để dễ dàng điều hướng lịch sử:

nhập mô tả hình ảnh ở đây

Nó có thể được dễ dàng bị ràng buộc để Ctrl-rvà / hoặcCtrl-s


0

Giải pháp sau đây kết hợp và mở rộng một số cách tiếp cận được đề cập ở trên: thêm các dòng sau vào ~/.bash_aliasestệp của bạn (không cần ~/.inputrc) để đạt được hành vi sau:

  1. di chuyển lên / xuống trong lịch sử (chỉ các mục có cùng tiền tố) bằng cách nhấn CTRL + UP và CTRL + DOWN. Điều này có thể cùng tồn tại với chức năng tiêu chuẩn của việc di chuyển lên / xuống trong toàn bộ lịch sử chỉ qua LÊN và XUỐNG
  2. nhảy đến từ tiếp theo / trước trong một dòng lệnh bằng cách nhấn CTRL + RIGHT và CTRL + LEFT
bind '"\e[1;5A":history-search-backward'
bind '"\e[1;5B":history-search-forward'
bind '"\e[1;5C":forward-word'
bind '"\e[1;5D":backward-word'

Đăng nhập lại vào shell (hoặc chạy source ./bash_aliases) để áp dụng các thay đổ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.