Làm thế nào tôi có thể tìm kiếm lịch sử bash và chạy lại một lệnh?


297

Tôi có thể tìm kiếm lịch sử trong bash và chạy kết quả không?

Câu trả lời:


428

Ctrl Rvào dòng lệnh và bắt đầu gõ lệnh trước đó. Khi một kết quả xuất hiện, tiếp tục nhấn Ctrl Rđể xem các trận đấu khác. Khi lệnh bạn muốn xuất hiện, chỉ cần nhấnEnter

Lưu ý rằng mặc dù Ctrl Rlà mặc định, nếu bạn muốn lệnh ( reverse-search-history) bị ràng buộc với Ctrl Tbạn, bạn có thể định cấu hình lệnh đó bằng cách sau:

liên kết '"\ Ct": tìm kiếm ngược lịch sử'

Có một loạt các lệnh ràng buộc đọc khác cũng có sẵn cho bạn. Hãy xem bashtrang người đàn ông .

Bash có nhiều phương tiện để tìm kiếm và truy cập lịch sử lệnh tương tác. Cơ bản nhất trong số đó là historynội dung. Gõ chỉ:

$ lịch sử

Sẽ in một danh sách các lệnh cùng với một chỉ mục số, như:

$ lịch sử
1 rõ ràng
2 ls -al
3 vim ~ / somefile.txt
4 lịch sử
$

Sau đó, bạn có thể thực hiện bất kỳ lệnh nào bằng cách sử dụng chỉ mục số của chúng bằng cách đặt trước chỉ mục bằng một lệnh !, như Mitch đã chỉ ra:

$! 1

Sẽ thực thi clearlệnh. Bản dựng lịch sử có nhiều tính năng, bạn có thể xem thêm trong các trang bashhistoryman.

Bạn cũng có thể chỉ định các độ lệch âm tương đối khi sử dụng công cụ !chỉ định, vì vậy sử dụng danh sách lịch sử của chúng tôi ở trên, nếu chúng tôi muốn thực hiện vimlại, chúng tôi có thể làm:

$! -2

Về cơ bản là bảo bash thực thi lệnh bạn đã chạy "hai lệnh trước". Để chạy lệnh trước đó trong danh sách lịch sử, chúng ta chỉ cần sử dụng !!(đây chỉ là cách viết tắt !-1).

Trình !chỉ định không giới hạn bạn chỉ định số lượng lệnh nào sẽ chạy. hayalci cho thấy rằng bạn có thể hướng dẫn bashthực hiện một lệnh dựa trên văn bản mà nó bắt đầu bằng (sử dụng !) hoặc văn bản trong chính lệnh đó (sử dụng !?). Một lần nữa, sử dụng danh sách lịch sử ví dụ của chúng tôi ở trên, nếu chúng tôi muốn thực hiện clearlại, tất cả những gì chúng tôi cần làm là gõ:

$! cl

và nhấn Enter. Còn bạn thì vimsao? Điều đó đơn giản như:

$ !? Một số

Điểm quan trọng nhất từ phản hồi của hayalci là cuộc gọi đến shoptnội dung:

$ shopt -s histverify

Điều này sẽ cho phép xác minh lịch sử để các lệnh được kết hợp bởi các !, !!!?định danh được không mù quáng thực hiện, nhưng thay vào đó điền vào trên dòng lệnh để bạn có thể đảm bảo rằng họ sẽ không làm điều ác trước khi thực hiện chúng. Điều này thậm chí còn quan trọng hơn khi bạn đang thực thi các lệnh với tư cách là người dùng root. Tùy chọn này có thể được đặt trong .bashrctệp khởi động của bạn để nó được đặt bất cứ khi nào bạn đăng nhập.

Như đã được chỉ ra, tất cả các thông tin này có thể được lượm lặt từ bashtrang người đàn ông . Dành cho !, !!, và!? người chỉ định, hãy xem Mục 9.3 Mở rộng Lịch sử .


39
+1 Tôi đã sử dụng Linux hơn 12 năm cho tất cả các hệ thống. Tôi không biết rằng nó đã tồn tại. Ước gì tôi có thể +10 làm thế nào tôi bỏ lỡ nó ??
Aiden Bell

1
Trên nhiều hệ thống, nhấn mũi tên lên cũng làm như vậy.
mas

Nếu ai đó hợp nhất '!', '!!', '!?', 'Lịch sử | grep 'và' ctrl-r 'thành một câu trả lời toàn diện, tôi sẽ chọn nó
Richard Hoskins

shoptđi vào bashrc, không phải bash_profile (hoặc nó sẽ không được kích hoạt cho các shell không đăng nhập shell).
Tobu

2
Ngoài ra, sau khi nhấn CTRL + R, bạn có thể sử dụng CTRL + SHIFT + R nhiều lần để quay lại lệnh trước
Gal Bracha

37

Thay thế cho crtl+R, bạn có thể tìm kiếm lịch sử bằng cách nhập

!text

Điều này sẽ tìm kiếm lịch sử cho lệnh gần đây nhất bắt đầu bằng 'văn bản'.

Nhưng tôi khuyên bạn nên đặt cái này trong .bashrc để ngăn thực thi lệnh sai.

shopt -s histverify

Điều này chỉ dẫn bash sao cho, sau bất kỳ hành động lịch sử nào (như !!:s/prev_text/after_text), nó đặt dòng kết quả vào dấu nhắc lệnh. Sau đó, bạn có thể xem lại hoặc chỉnh sửa lệnh và nhấn Enter sau đó.


5
Sử dụng văn bản !? Để thực hiện lại lệnh gần đây nhất chứa (trái ngược với bắt đầu bằng) "văn bản".
mark4o

3
Nếu ai đó hợp nhất '!', '!!', '!?', 'Lịch sử | grep 'và' ctrl-r 'thành một câu trả lời toàn diện, tôi sẽ chọn nó.
Richard Hoskins

32

Bạn cũng có thể làm:

history | grep "stuff"

nó sẽ trả lại một cái gì đó như

num stuff

sau đó bạn có thể gõ

!num

15

Tôi thích sử dụng lịch sử tìm kiếm-lạc hậu hơn lịch sử tìm kiếm ngược. Cái trước cho phép bạn gõ một vài ký tự của lệnh sau đó nhấn phím tìm kiếm, trái ngược với việc nhấn phím tìm kiếm trước sau đó gõ chuỗi tìm kiếm.

Theo mặc định trên hệ thống của tôi, Mp và Mn liên kết với các chức năng tương tự nhưng tôi thích ràng buộc các phím mũi tên:

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

13

Tôi có một bí danh thực sự tuyệt vời, h. Nó thực sự chỉ là "history | grep", nhưng tôi lọc ra các mục "lệnh h" trước đó bằng "grep -E -v"

alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "

được sử dụng như

h aliases
2003  less .bash_aliases

1
Điều này cũng có thể được thực hiện bằng cách thêm lệnh vào HISTIGNORE.
tanenbring

12

Tuyệt vời, Sean! Tôi sẽ đưa điều này vào một bình luận, nhưng tôi có một vài điểm danh tiếng ngại ngùng. :-)

Một kỹ thuật có liên quan và hữu ích khác là khả năng chạy một lệnh trước đó trong khi thay đổi một từ. Giả sử bạn đánh máy tên thư mục hoặc muốn thay đổi tên tệp:

$ echo tên tôi là bob
tên tôi là Bob
$ ^ bob ^ jordan
tiếng vang tên tôi là jordan
tên tôi là Jordan

Lưu ý rằng lệnh được mở rộng, thay thế và xuất ra trước khi lệnh được chạy, vì vậy nếu lệnh sai được chạy, bạn có thể thấy bash nghĩ nó đang làm gì.


6

Vì điều hướng trong lịch sử sử dụng Ctrl-r là IMO cồng kềnh, bạn có thể muốn xem xét hh :

https://github.com/dvorka/hstr

giúp điều hướng đơn giản hơn, đơn giản và hiệu quả hơn - bao gồm chạy lệnh:

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


Làm thế nào để sử dụng nó? Những phím nào để nhấn để xem hình ảnh này?
Nakilon

2
Khi bạn cài đặt hh, bạn có thể sử dụng lệnh hh HOẶC liên kết nó với bất kỳ phím tắt nào (thường là Ctrl-r) như được mô tả trong tài liệu.
Martin Dvorak

nó liên kết với ctrl + rmặc định ngay bây giờ
Alleo

4

Tại dấu nhắc lệnh bash, nhập control-R, sau đó nhập một vài ký tự của lệnh bạn muốn và cơ sở đọc dòng của bash sẽ tìm kiếm trong lịch sử lệnh cho lệnh đó.

Sau khi bạn đã bắt đầu tìm kiếm, bạn có thể nhập lại control-R để chuyển sang lệnh khớp tiếp theo.


3

Nếu bạn đã shell của bạn cấu hình để sử dụng vitổ hợp phím ( set -o vihoặc có set editing-mode vitrong $HOME/.inputrc), sau đó bạn tìm kiếm với <Esc>/some-command<Return>và nhấn n(tiếp theo) hoặc Shift-n(trước đó) để chuyển qua lịch sử dòng lệnh.


Đây là gần nhất với người dùng vim.
Gabor Marton

2

CTRL+ Rhoạt động tốt, như @ John1024 đã đề xuất, nhưng hơi tẻ nhạt nếu nhiều lệnh gần đây của bạn tương tự và bạn muốn một cách nhanh chóng để quét tất cả chúng. Một cách khác là sử dụng history:

$ history | grep keyword

0

Tôi thích HSTR nhưng đôi khi dường như tôi không thể cài đặt nó. Vì vậy, tôi đã viết một bí danh bằng cách sử dụng fzf bắt chước hành vi của nó ( hx, cho "lịch sử thực hiện")

alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
  • history : tốt, lấy lịch sử
  • sed : xóa cột số khỏi danh sách (POSIX)
  • fzf: đây là phép thuật, cho phép bạn tìm kiếm danh sách một cách tương tác hoặc di chuyển với C-JC-Ksau đó thực hiện một lệnh với Enter.
  • --height : đặt số lượng dòng hiển thị.
  • --tac : danh sách hoàn nguyên (logic hơn cho một lịch sử)
  • --tiebreak=index : giữ thứ tự lịch sử khi fzf cập nhật kết quả
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.