Xử lý lịch sử Bash với nhiều thiết bị đầu cuối


110

Tôi sử dụng chủ yếu Terminator và nó thường được mở với 3 cửa sổ đầu cuối tách. Tôi cũng sử dụng thiết bị đầu cuối Gnome vì nhiều lý do.
Tôi tự hỏi làm thế nào lịch sử bash được xử lý trong trường hợp này vì đôi khi tôi bỏ lỡ các lệnh đã ban hành trước đây khi tôi chạyhistory

Ví dụ: lời nhắc của tôi hiển thị dòng lịch sử bash hiện tại ( \!) và nếu tôi khởi chạy Terminator với 3 cửa sổ đầu cuối phân tách, tôi sẽ nhận được cùng một dòng lịch sử (giả sử 100) trên tất cả các thiết bị đầu cuối. Lịch sử nào sẽ được lưu lại?

Đồng thời khởi chạy Gnome Terminal sau khi sử dụng Terminator, tôi nhận được dòng 100 khi khởi động bất kể tất cả các lệnh được ban hành trước đó trong Terminator


Câu trả lời:


107

Phiên bash được lưu là phiên dành cho thiết bị đầu cuối được đóng mới nhất. Nếu bạn muốn lưu các lệnh cho mỗi phiên, bạn có thể sử dụng mẹo được giải thích ở đây .

export PROMPT_COMMAND='history -a'

Để trích dẫn manpage: Triệu Nếu được đặt, giá trị được thực thi dưới dạng lệnh trước khi phát hành từng dấu nhắc chính.

Vì vậy, mỗi khi lệnh của tôi kết thúc, nó sẽ thêm mục lịch sử không được ghi vào ~/.bash_historytrước khi hiển thị lại lời nhắc (chỉ $ PS1).

Vì vậy, sau khi đặt dòng đó vào, /etc/bash.bashrctôi không phải tìm lại chính mình hoặc mất đi những giây quý giá để gõ lại công cụ chỉ vì tôi lười biếng với các thiết bị đầu cuối của mình.

Dù sao, bạn sẽ cần tính đến việc các lệnh từ các phiên khác nhau sẽ được trộn lẫn trong tệp lịch sử của bạn để việc đọc nó sau này trở nên đơn giản.

Xem thêm:


không phải nó được lưu trữ riêng cho các TTL khác nhau sao ??
Vineet Menon

Xuất sắc. Cảm ơn đã giải thích và giải pháp. Tôi đã thử export PROMPT_COMMAND='history -a; history -r'và tôi nhận được một số số dòng lịch sử kỳ lạ trong thiết bị đầu cuối - sau khi ban hành một số số dòng lịch sử lệnh nhảy vào năm 2000 thay vì 1, điều này thật lạ nhưng nó hoạt động như đã nói - tất cả lịch sử thiết bị đầu cuối được lưu.
zetah

@VineetMenon Để biết thêm chi tiết xem tại đây . Các phần thú vị: Khi shell khởi động, lịch sử được khởi tạo từ tệp được đặt tên bởi biến HISTFILE (mặc định `~ / .bash_history '). [...] Khi một vỏ tương tác thoát ra, các dòng $ HISTSIZE cuối cùng được sao chép từ danh sách lịch sử vào tệp có tên $ HISTFILE.
jcollado



32

Sau nhiều lần đọc man bash, tôi sử dụng các tệp lịch sử riêng biệt cho mỗi shell. Tôi đã làm mkdir -m 0700 ~/.historysau đó thêm

[[ -d ~/.history ]] || mkdir --mode=0700 ~/.history
[[ -d ~/.history ]] && chmod 0700 ~/.history
HISTFILE=~/.history/history.$(date +%y%b%d-%H%M%S).$$
# close any old history file by zeroing HISTFILESIZE  
HISTFILESIZE=0  
# then set HISTFILESIZE to a large value
HISTFILESIZE=4096  
HISTSIZE=4096  

để tôi ~/.bashrc. Thỉnh thoảng, tôi nhớ du -sk .historyvà dọn dẹp nó. Thật tuyệt khi mọi lệnh tôi đã gõ được bảo tồn cho tôi.

Tôi chỉ sử dụng ở trên để xem những gì tôi đã làm, vào cuối:
cut -f1 "-d " .history/* | sort | uniq -c |sort -n -r |less
hoặc
cut -f1-2 "-d " .history/* | sort | uniq -c |sort -n -r |less
(để bao gồm đối số thứ nhất, ví dụ như sudo mounttrong chuỗi sắp xếp).


3
Tại sao bạn chỉ định HISTFILESIZEhai lần?
Daniel

2
Bằng cách đặt HISTFILESIZE thành 0, tôi xóa bộ đệm lịch sử và đặt lại cơ chế lưu lịch sử. Sau đó, tôi đặt kích thước tôi thực sự muốn và bắt đầu lưu lịch sử trong HISTFILE. Xem phần LỊCH SỬ của man bash.
ví von

1
Có cách nào để hợp nhất các tập tin lịch sử để làm Ctrl+rviệc lại không?
n611x007

3
Đây sẽ là một câu hỏi mới, nhưng tôi không nghĩ đó là một ý tưởng hay. Tôi sử dụng egrep 'whatever' .history/*(hoặc cat .history/* | egrep 'whatever') thay vào đó và sử dụng Ctrl-r để tìm kiếm lịch sử của một phiên riêng lẻ. Đọc man bash-builtinsvề lệnh lịch sử. My sort .history/* | uniq -c | sort -n | wc -lhiển thị 16033 lệnh duy nhất, cut '-d ' -f1 .history/* | sort | uniq -c | sort -nhiển thị 2004 lệnh duy nhất, chủ yếu là lỗi chính tả. Tải tất cả những thứ đó vào "danh sách lịch sử" của bash sẽ không giúp được gì.
ví von

@waltinator - Tôi biết đây là một nhận xét cũ, nhưng bạn có ngụ ý rằng việc thiết lập một biến môi trường bằng cách nào đó kích hoạt một hành động ngay lập tức? quá trình nào sẽ nhận ra thực tế bạn đã gán giá trị 0 cho HISTFILESIZE trong trình bao cục bộ và sau đó thay đổi ngay lập tức thành 4096? đây có phải là một cái gì đó không có giấy tờ về việc xử lý các tên biến nhất định của bash không?
không đồng bộ

8

Để hiển thị historytừ tất cả các thiết bị đầu cuối:

Thêm vào export PROMPT_COMMAND='history -a; history -r'tệp .bashrc của bạn.

Nguồn: http : // nắc Maximum.org/blog/flush-bash_history-after-each-command



3
Tôi sẽ nói rằng sau một vài tháng sử dụng, cuối cùng tôi đã nhận xét điều này chỉ mới gần đây. Thật buồn vui vì tôi không muốn sàng lọc 100 lệnh cuối cùng chỉ để chạy lệnh tôi đã chạy ban đầu trong khung Tmux, đôi khi tôi có thể có một lệnh nhật ký chuyên dụng mà tôi cần phải khởi động lại.
Elijah Lynn

Một giải pháp tốt đẹp mà vỏ cá đưa ra là a history --merge. Tôi đã sử dụng điều này trong một năm hoặc lâu hơn và nó giải quyết vấn đề. Khi tôi muốn lịch sử gần đây nhất từ ​​các phiên khác, tôi chỉ cần chạy lệnh đó và nó có sẵn cho tôi ngay lập tức.
Elijah Lynn

xuất khẩu là không cần thiết.
Chuộc tội có giới hạn

6

Xem thêm " giữ lịch sử liên tục trong bash " cho một lựa chọn khác. Nó nhắc nhở bạn gửi tất cả các lệnh đã nhập vào bất kỳ thiết bị đầu cuối nào vào một tệp "lịch sử liên tục" (bên cạnh những gì thường được thực hiện cho thông thường .history).


1
Tôi đã chèn $$ để tạo dòng echo $$ $date_part "$command_part" >> ~/.persistent_historyĐiều này tiền tố các mục với các PID của quy trình bash của chúng, để chúng ta có thể gỡ bỏ nhiều lịch sử.
Evgeni Sergeev

Lịch sử thay thế có thể được thực hiện để hoạt động với tìm kiếm lịch sử CTRL-R không?
tối đa
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.