Tôi có thể tìm kiếm lịch sử trong bash và chạy kết quả không?
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:
Gõ 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 bash
trang 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à history
nộ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 clear
lệ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 bash
và history
man.
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 vim
lạ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 bash
thự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 clear
lạ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ì vim
sao? Đ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 shopt
nộ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 !
, !!
và !?
đị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 .bashrc
tệ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ừ bash
trang 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ử .
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).
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 đó.
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'
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
HISTIGNORE
.
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ì.
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:
ctrl + r
mặc định ngay bây giờ
Nếu bạn đã shell của bạn cấu hình để 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 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.
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-J
và C-K
sau đó 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ả