Có thể thực hiện viết vào .bash_history ngay lập tức không?


124

Tôi thường mở rất nhiều và rất nhiều Terminals [Ngay bây giờ tôi có 7 mở trên vùng làm việc này] và tôi thường tìm kiếm historyvới greptìm một lệnh Tôi vừa mới viết gần đây, nhưng tôi không muốn để săn lùng các thiết bị đầu cuối và sau đó di chuyển lên và săn lùng nó nhiều hơn, v.v. Đôi khi, các thiết bị đầu cuối của tôi đóng mà không có 'lối ra' và mọi thứ tôi đã viết bị mất [Đôi khi tôi cần một cái gì đó tôi đã viết trong một thiết bị đầu cuối đã bị giết].

Vì vậy, có cách nào để làm cho nó để mỗi thiết bị đầu cuối ghi vào .bash_history ngay lập tức? hoặc ít nhất một lần một phút, hoặc một cái gì đó như thế?


2
Thông thường tôi sử dụng control-rđể tìm kiếm ngược trong lịch sử lệnh của một bash. Thuận tiện hơn history | greptrừ khi bạn cần một regex.
Peter Cordes

Câu trả lời:


92

Một giải pháp đơn giản như chi tiết trong Cập nhật Lịch sử Bash trong Thời gian thực .

Nó nói để đặt các lệnh đó trong cấu hình .bashrc:

shopt -s histappend
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"

Lệnh đầu tiên thay đổi .historychế độ tập tin để chắp thêm. Và thứ hai cấu hình history -alệnh sẽ được chạy tại mỗi dấu nhắc shell. Các -angay lập tức viết những dòng mới / hiện tại để các tập tin lịch sử.

Liên quan đến zsh:


1
cũng loại công trình này. Tôi đã thử một số thử nghiệm nữa và nó dường như chỉ hoạt động trên lệnh đầu tiên. nó hoạt động chính xác cho bạn?
Matt

54

Hãy thử đặt cái này vào .bashrc:

shopt -s histappend                      # append to history, don't overwrite it
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

Tín dụng tại đây: https://stackoverflow.com/questions/103944/real-time-history-export-amongst-bash-terminal-windows/3055135

history -cxóa lịch sử của phiên chạy. Điều này sẽ làm giảm bộ đếm lịch sử theo số lượng $HISTSIZE. history -rđọc nội dung $HISTFILEvà chèn chúng vào lịch sử phiên chạy hiện tại. Điều này sẽ nâng bộ đếm lịch sử theo số lượng dòng trong $HISTFILE.

Tôi nghĩ điều đó có nghĩa là các lệnh có sẵn gần như ngay lập tức (bạn có một thiết bị đầu cuối, ghi echo 1, thiết bị đầu cuối thứ hai echo 2, đầu tiên echo 3và sau khi nhấn mũi tên xuống hai lần, bạn nên có echo 2sẵn. Bạn phải ra lệnh trong một thiết bị đầu cuối nhất định để có quyền truy cập vào những gì có đã được viết.


Xuất sắc! Cảm ơn. Tự hỏi tại sao những lựa chọn đó không được ghi lại trong man history...
artfulrobot

10
@artfulrobot: Lệnh này bashđược tích hợp sẵn nên được mô tả trong man bash. Bạn cũng có thể sử dụng help history.
pabouk

2
Tôi có cấu hình zsh của mình để hoạt động như thế này: Mỗi shell theo dõi lịch sử OWN của nó (và trước đó, lịch sử kết hợp) và mọi lệnh được thêm vào lịch sử kết hợp. Điều này kháctốt hơn là luôn tải lại lịch sử cho mỗi lệnh cho mọi shell, bởi vì tôi có xu hướng có một "luồng công việc" hoặc "công việc" khác nhau cho mỗi thiết bị đầu cuối shell. Tôi nghĩ rằng đó là sự khác biệt giữa điều này với -r-cchỉ có -a.
Steven Lu

Vì vậy, chính xác những gì bạn đang sử dụng? history -c; history -r? Tôi đoán nó tốt hơn cho bạn, đôi khi chỉ tốt hơn cho tôi, tôi thường sử dụng một số vỏ để làm một công việc vì vậy tôi thích có lịch sử kết hợp càng nhiều càng tốt. Tôi thực sự nhớ rằng lệnh được ghi vào lịch sử chỉ sau khi nó kết thúc. thông thường, khi tôi bắt đầu một phiên ssh cho một máy chủ lưu trữ và muốn mở một phiên khác trong khi phiên bản đầu tiên vẫn đang chạy, tôi phải gõ lại vì nó chưa được ghi vào lịch sử.
sup

Tôi nghĩ rằng tôi không bao giờ bị mắc kẹt đủ lâu để tìm ra cách tạo bash đồng thời theo dõi các luồng lịch sử song song (trên cơ sở ví dụ shell) trong khi ngay lập tức ghi lịch sử vào tệp lịch sử chính. Zsh làm cho việc đó trở nên dễ dàng hơn nhiều, ngoài ra tôi đã xác định hàm zsh để viết ra rất nhiều siêu dữ liệu ưa thích vào một tệp lịch sử nâng cao về phát minh của tôi. Nó trở nên khá không thể thiếu. Dù sao, cơ chế có premd () và preexec () cho zsh được gửi args mô tả lệnh đã nhập. Sau đó, nó trở nên tầm thường để hướng nó đến các tập tin. history -acó thể đủ
Steven Lu

38

Tôi có một tệp lịch sử lớn với khoảng 100000 mục và các biến thể xóa danh sách lịch sử và đọc toàn bộ tệp lịch sử (sử dụng history -chistory -r) giới thiệu độ trễ đáng chú ý (có thể là 0,2 giây) trước khi dấu nhắc được hiển thị. Sử dụng history -nđể chỉ các dòng mới được đọc từ tệp lịch sử nhanh hơn:

shopt -s histappend
PROMPT_COMMAND='history -a;history -n'

PROMPT_COMMAND không phải xuất ra vì nó là biến shell.


Xuất sắc! Không còn lịch sử bị mất khi kết nối bị mất!
Tobia

Đây là điều tuyệt vời. Bằng cách thêm vào tệp và đọc từ tệp, nó sẽ chia sẻ lịch sử trên nhiều thiết bị đầu cuối.
wvducky

3

Một lưu ý cho tất cả các câu trả lời khác (về cơ bản là giống nhau):

Thiết lập PROMPT_COMMAND="history -a;$PROMPT_COMMAND"trong .bashrc(hoặc bạn bè) là đủ.

Ngoài ra, bạn có thể chạy thủ công history -abất cứ khi nào bạn muốn "chụp nhanh" lịch sử trong phiên hiện tại.

Lệnh shopt -s histappendkhông cần thiết vì history -aluôn nối các dòng mới vào tệp và không bao giờ ghi đè lên nó. Ngoài ra, ít nhất là kể từ Bash 4, histappendlà hành vi mặc định.


Trên máy mac 10.13.6 của tôi, có vẻ như nó không hoạt động nếu không có shopt -s histappend. Cũng lưu ý rằng tôi đã thêm nó vào~/.bash_profile
ubershmekel

Có thể có một cài đặt khác ở đâu đó trong hệ thống của bạn bị vô hiệu hóa histappend, vì đó là hành vi mặc định. Tôi sẽ tìm nó, nhưng tôi không có quyền truy cập vào máy Mac.
Guss
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.