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


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


271
2017-07-17 19:23


gốc




Các câu trả lời:


Kiểu Ctrl  R tại dòng lệnh và bắt đầu gõ lệnh trước đó. Khi kết quả xuất hiện, hãy tiếp tục 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ấn Đi vào

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

bind '"\ C-t": đảo ngược tìm kiếm-lịch sử'

Có một loạt các lệnh ràng buộc readline khác có sẵn cho bạn. Hãy nhìn vào bash trang người đàn ông.

Bash có nhiều cơ sở để 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à history được xây dựng trong. Nhập chỉ:

$ history

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

$ history
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 trong số các lệnh này bằng cách sử dụng chỉ mục số của chúng bằng cách mở đầu chỉ mục bằng một chỉ mục !, như Mitch chỉ ra:

$! 1

Sẽ thực thi clear chỉ huy. Bản dựng lịch sử có nhiều tính năng, bạn có thể thấy nhiều hơn trong bash và history trang người đàn ông.

Bạn cũng có thể chỉ định độ lệch âm tương đối khi sử dụng ! người chỉ định, vì vậy hã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 thi vim một lần nữa, chúng ta có thể làm:

$! -2

Đó là cơ bản nói bash để thực hiện lệnh bạn chạy "hai lệnh trước đây." Để chạy lệnh trước trong danh sách lịch sử, chúng tôi chỉ có thể sử dụng !! (chỉ là viết tắt của !-1).

Các ! designator không giới hạn bạn chỉ định số để chạy lệnh nào. hayalci cho thấy rằng bạn có thể hướng dẫn bash thực thi lệnh dựa trên văn bả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 thi clear một lần nữa, tất cả những gì chúng ta cần làm là gõ:

$! cl

và hãy nhấn Đi vào. Và thế còn vim? Điều đó đơn giản như:

$!? một số

Điểm quan trọng nhất từ hayalciCâu trả lời là cuộc gọi đến shopt được xây dựng trong:

$ shopt -s histverify

Điều này sẽ bật xác minh lịch sử để các lệnh khớp với lệnh !, !!!? các nhà thiết kế không được thực thi một cách mù quáng, mà thay vào đó, hãy điền vào dòng lệnh để bạn có thể đảm bảo họ sẽ không làm điều xấu 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 hiện các lệnh như người dùng root. Tùy chọn này có thể được đặt trong .bashrc tệp khởi động để tệp được đặt bất cứ khi nào bạn đăng nhập.

Như đã được chỉ ra, tất cả thông tin này có thể được thu thập từ bash trang người đàn ông. Đối với!, !!, và!? người thiết kế, hãy xem phần 9.3 Mở rộng lịch sử.


392
2017-07-17 19:25



1 Tôi đã sử dụng Linux trong hơn 12 năm cho tất cả các hệ thống. Tôi không biết điều đó tồn tại. Ước gì tôi có thể +10 làm thế nào tôi đã bỏ lỡ nó ?? - Aiden Bell
Tôi đã không phát hiện ra nó cho đến khi tôi bắt đầu sử dụng emacs thường xuyên. Sau đó, tôi vô tình gõ nó trong bash một ngày (nghĩ rằng tôi đã ở emacs). - Sean Bright
Trên nhiều hệ thống, nhấn mũi tên lên cũng vậy. - mas
Mũi tên lên cho tôi chỉ chuyển sang lệnh trước. Nhưng yeah, nó là tất cả ràng buộc với bất cứ điều gì bạn muốn. - Sean Bright
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


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

!text

Thao tác này sẽ tìm kiếm lịch sử cho lệnh gần đây nhất bắt đầu với 'văn bản'.

Nhưng tôi đề nghị bạn đặt nó trong .bashrc của bạn để ngăn chặn thực hiện lệnh sai.

shopt -s histverify

Điều này hướng dẫn bash như vậy, sau bất kì hành động lịch sử (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 đó.


34
2017-07-17 20:40



Sử dụng!? Văn bản để thực hiện lại lệnh gần đây nhất có chứa (như trái ngược với bắt đầu bằng) "văn bản". - mark4o
Nếu ai đó hợp nhất '!', '!!', '!?', 'Lịch sử | grep ', và' ctrl-r 'vào một câu trả lời toàn diện, tôi sẽ chọn nó. - Richard Hoskins


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

history | grep "stuff"

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

num stuff

thì bạn có thể gõ

!num

27
2017-07-17 20:21





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

Theo mặc định trên hệ thống của tôi, M-p và M-n liên kết với các hàm 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'

14
2018-02-02 20:32





Tuyệt vời, Sean! Tôi đã đặt điều này trong một bình luận, nhưng tôi là một vài điểm danh tiếng nhút nhát. :-)

Một kỹ thuật liên quan và hữu ích khác là khả năng chạy lệnh trước đó trong khi thay đổi một từ. Giả sử bạn đã gõ 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
echo 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à đầu 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 những gì bash nghĩ rằng nó đang làm.


12
2017-09-10 14:23





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" h command "trước đó với" grep -E -v "

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

được sử dụng như

h aliases
2003  less .bash_aliases

12
2017-09-25 16:45



Đ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


Khi điều hướng thông qua lịch sử sử dụng Ctrl-r là IMO rườm rà, bạn có thể cân nhắc hh:

https://github.com/dvorka/hstr

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

enter image description here


5
2017-12-18 16:37



Làm thế nào để sử dụng nó? Phím nào để nhấn để xem ảnh này? - Nakilon
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 + r theo mặc định ngay bây giờ - Alleo


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

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


3
2017-09-04 04:55





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


3
2017-11-22 15:21



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


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

$ history | grep keyword

2
2017-09-04 05:11