Lưu lịch sử bash từ nhiều Konsole không hoạt động chính xác


9

Tôi sử dụng nhiều thiết bị đầu cuối Konsole. Và tôi muốn tất cả các lệnh tôi gõ trong mỗi thiết bị đầu cuối sẽ được lưu trong lịch sử lệnh, để konsole tiếp theo tôi mở sẽ có tất cả chúng. Để ngăn mỗi thiết bị đầu cuối ghi lại lịch sử lệnh của thiết bị đầu cuối khác, tôi đã đưa ra các cài đặt sau trong.bashrc

# avoid duplicates and commands starting with space
export HISTCONTROL=ignoredups:erasedups:ignorespace
# append history entries..
shopt -s histappend
#My machine reboots without warning sometimes.Hence to save commands instantaneously.
export PROMPT_COMMAND="history -a"  
export HISTSIZE=1000
PS1="\[\e[1;34m\]\! \[\e[0m\]"$PS1

Tôi đã đưa ra dòng cuối cùng để xem số lệnh trong lời nhắc của tôi. Lệnh không. chưa bao giờ vượt quá 600, nhưng vẫn còn một số lệnh cũ của tôi đang biến mất khỏi lịch sử. Có nhiều lệnh được đưa ra lặp đi lặp lại, nhưng như mong đợi ignoredups, nó không bao giờ tăng lệnh không có dấu nhắc. Tuy nhiên, các lệnh cũ vẫn đang biến mất. Và số lượng lệnh trong lịch sử luôn chỉ còn hơn 500.

Các .bash_historytập tin vẫn chứa rất nhiều bản sao mặc dù bỏ qua.

PS: Đầu ra của echo $HISTSIZE$HISTFILESIZEcả hai=1000


Cập nhật: Tôi tìm thấy vấn đề trong mục trên .bashrc. Chỉ cần gọi history -avào PROMPT_COMMANDđơn giản là nối thêm lệnh mới cuối cùng vào .bash_history. Vì vậy, ignoredupserasedupskhông có hiệu lực.

Có cách nào, tôi vẫn có thể viết thư cho .bash_history mà không cần sao chép từ mọi thiết bị đầu cuối không? Tôi không muốn tải toàn bộ lịch sử tại mỗi dấu nhắc lệnh bằng cách history -rviết lại history -w, bởi vì các lệnh tôi đã ban hành trong một thiết bị đầu cuối cũng sẽ xuất hiện trong một thiết bị đầu cuối chạy song song khác. Tôi muốn các lệnh kết hợp chỉ xuất hiện trong một thiết bị đầu cuối mới.

Câu đố, tại sao lịch sử của tôi đã bị cắt giảm đến 500 được giải quyết. Tôi nhận thấy nó xảy ra mỗi khi tôi ssh vào máy này. Tạo một .bash_profilevới mục sau đây đã giải quyết vấn đề này.

if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

Bây giờ .bashrc của tôi được thực thi mỗi lần tôi cũng ssh. Và kích thước tập tin lịch sử hiện đang tăng đơn điệu.


Đây có phải là những gì bạn đang theo đuổi? unix.stackexchange.com/questions/1288/ Mạnh
jasonwryan

Không. Tôi muốn tránh yêu cầu thứ hai trong danh sách của Oli's. Tôi không muốn lịch sử của các thiết bị đầu cuối khác nhau của mình bị xáo trộn. Cho đến khi tôi bắt đầu một thiết bị đầu cuối mới. Đây là những gì tự nhiên xảy ra khi tôi tắt máy đúng cách. Nhưng đôi khi tắt máy đúng cách là không thể và trừ khi tôi lưu lại lịch sử ngay lập tức, tất cả sẽ bị mất trong một lần tắt nguồn đột ngột.
Ấn Độjoe

Nghe có vẻ khá giống với câu hỏi sắp tới trong bug-bashdanh sách gửi thư một năm sau khi câu hỏi này được đăng : lists.gnu.org/archive/html/orms-bash/2013-07/msg00092.html
cú pháp từ

Câu trả lời:


1

Tôi đã kết luận rằng không thể nối các lệnh mới trực tiếp và đồng thời để loại bỏ bất kỳ bản sao nào. Vì vậy, giải pháp của tôi là chạy các lệnh sau trong một thời gian. hoặc để đặt nó trong crontab của tôi.

tac $HOME/.bash_history | awk '!seen[$0]++' | tac > $HOME/.hist_Temp 
mv $HOME/.hist_Temp $HOME/.bash_history

Lệnh trên sẽ giữ lần xuất hiện cuối cùng của lệnh và xóa mọi lần lặp lại khác phía trên nó khỏi tệp lịch sử mà không làm rối trật tự.


0

Điều đó thật xấu xí, và tôi chắc chắn rằng sedhoặc awksẽ tốt hơn, nhưng tôi đã cố gắng khắc phục vấn đề tương tự bằng cách thêm vấn đề này vào .bashrc:

export HISTFILE=.bash_history_`tty | python -c 'import sys ; sys.stdout.write(sys.stdin.read().strip().replace("/", "_"))'`

Điều này sẽ tạo một tệp lịch sử riêng cho mỗi thiết bị đầu cuối mà bạn mở, tuy nhiên nếu bạn chạy bash trong bash, nó sẽ sử dụng cùng một lịch sử, nhưng không nên ghi đè. Tôi sẽ cảnh báo bạn với một cảnh báo từ kinh nghiệm của tôi. Mặc dù điều này không hoạt động và giữ cho lịch sử không bị ghi đè, bạn phải grepnhiều tệp để thử và tìm lịch sử bạn đang tìm kiếm, đôi khi có thể tốn thời gian.

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.