Mất lịch sử Bash khi sử dụng histappend


18

Tôi thích giữ nhiều lịch sử, vì vậy tôi đã histappendthiết lập trong tôi .bashrc. Hầu hết thời gian mọi thứ hoạt động tốt, với lịch sử được xây dựng từ nhiều vỏ bổ sung. Tuy nhiên, thỉnh thoảng, tôi sẽ khởi động một trình bao mới và thấy rằng tôi đã mất toàn bộ lịch sử - và nó thường chỉ chứa một số lệnh từ trình bao cuối cùng để thoát (nghĩa là không chỉ ghi đè thay vì nối thêm ). Bởi vì điều này, tôi nghi ngờ rằng nó xảy ra ở thoát shell, chứ không phải từ một số quá trình khác giết chết .bash_historytệp. Ủng hộ kết luận này, tôi có số lệnh lịch sử trong lời nhắc của mình và tôi chưa bao giờ thấy chúng nhảy xuống.

Bất cứ ai cũng từng gặp phải một vấn đề tương tự? Hoặc thậm chí chỉ có đề xuất làm thế nào để theo dõi vấn đề?


Câu trả lời:


13

Xin lỗi để trả lời câu hỏi của riêng tôi, nhưng không có câu trả lời nào khác thực sự giải quyết vấn đề.

Cuối cùng tôi đã nhận ra rằng điều này chỉ xảy ra khi đóng cửa gnome-terminal chính nó (tức là tệp> thoát, nút 'x', alt + F4) và thậm chí sau đó thường chỉ khi đóng một số thiết bị đầu cuối liên tiếp. Nó không bao giờ xảy ra khi sử dụng ctrl-D để đóng vỏ, để thiết bị đầu cuối theo sau.

Nếu tôi có thể ghim nó đủ tốt, tôi sẽ gửi báo cáo lỗi gnome-terminal. Trong khi đó, có lẽ điều này sẽ giúp một số người khác đến đây từ google!


10

Không biết tại sao điều này xảy ra, nhưng có lẽ bạn có thể tránh được vấn đề bằng cách buộc bash ghi vào tệp lịch sử của nó mỗi khi nó hiển thị lời nhắc:

PROMPT_COMMAND="history -a; history -n"

Điều này sẽ ghi (-a) và sau đó đọc lại (-n) tệp lịch sử mỗi lần nhắc bash cho lệnh tiếp theo. Lợi ích bổ sung: bạn sẽ nhận được lệnh X trong shell 1 trong lịch sử của shell 2.


Không hoạt động trên GNU bash, phiên bản 3.00.15 (1) -release (i686-redhat-linux-gnu)
David Mackffy

2
Bạn có thể giải thích "không hoạt động" nghĩa là gì không?
innaM

3
Lợi ích bổ sung mà bạn trích dẫn là trong nhiều trường hợp là nhược điểm. Đó không phải là hành vi mà tôi đang tìm kiếm, vì tôi có thể đang thực hiện hai nhiệm vụ hoàn toàn riêng biệt trong các vỏ riêng biệt và không muốn xen vào lịch sử của chúng. Điều này cũng có thể không giúp được gì. Khi lịch sử biến mất, đó là xóa nội dung của .bash_history - Tôi không mong đợi việc chúng được viết ở lối thoát vỏ hay bởi PROMPT_COMMAND.
Cascabel

5
history -nlà dễ vỡ. Nó đáng tin cậy hơn để làm history -a; history -c; history -r. Để giải thích điều này, trước tiên tôi sẽ lưu ý rằng điều history -ađó đúng - ý chí của bạn .bash_historychứa tất cả các lệnh bạn đã nhập, theo thứ tự bạn đã nhập chúng - giả sử rằng bạn chạy history -asau mỗi lệnh. Thách thức là giữ cho ý tưởng về lịch sử của shell được đồng bộ hóa với tệp .bash_history. Điều này là dễ dàng với -c-r, vấn đề là nó có thể chậm nếu nó lớn. -ncó thể phá vỡ vì nó xác định không chính xác dòng nào là mới. (Tôi sắp hết chỗ ở đây!)
Aaron McDaid

4
(... Nếu bạn sử dụng -n) Hãy tưởng tượng bạn thực thi một lệnh trong shell 1 : ls. Sau đó, trong một shell khác, Shell Two, bạn thực thi cd. Bây giờ, lịch sử trong .bash_history là chính xác vì history -atrong của bạn PROMPT_COMMAND- nó sẽ chứa ls \n cd \n. Tiếp theo, bạn quay lại shell One và gõ pwd. Shell One nghĩ rằng chỉ có lệnh n lịch sử ( ls). Bây giờ nó nghĩ rằng có hai lệnh ( lspwd) trong lịch sử. Khi bạn làm điều -nđó nghĩ (tôi có hai lệnh trong lịch sử của mình và có hai lệnh trong .bash_history, do đó tôi cập nhật.)
Aaron McDaid

3

Kinh nghiệm của tôi là shell đã cập nhật tệp lịch sử tại thời điểm thoát. Vì vậy, "lịch sử" ban đầu của một chiếc vỏ phụ thuộc vào quan điểm về lịch sử của chiếc vỏ gần đây nhất.

Kết quả của việc này là bạn có thể nhận được các lệnh đến và đi từ lịch sử, tùy thuộc vào cách các shell khác bắt đầu và dừng lại.


2
Tôi hiểu rất rõ cách viết tệp lịch sử - đây là lý do tại sao tôi chỉ định trong câu hỏi của mình rằng tôi đang sử dụng histappend. Vấn đề không phải là nội dung bất ngờ, mà là mất hoàn toàn nội dung được lưu trữ trước đó.
Cascabel

Điều này giải thích tại sao tôi mất lịch sử của mình ...
B Bảy

1

Tôi đã thấy điều này xảy ra trước đây nhưng đó là một vấn đề với lỗi đĩa đang xảy ra với tần suất tăng dần. Tôi sẽ chạy quét trên ổ đĩa. Nếu hóa ra ổ đĩa vẫn ổn, tôi sẽ kiểm tra xem tệp này có vượt quá giới hạn lịch sử shell tùy ý không.

Một cái gì đó có thể có thể ngăn điều đó xảy ra sẽ là tiếp tục cắt tỉa tệp thành 80 dòng hoặc nhiều lệnh bạn muốn lịch sử thực hiện.


Tôi không có quyền truy cập root trên máy, điều này đang xảy ra, nhưng tôi khá tự tin rằng ổ đĩa vẫn ổn. Thư mục nhà của tôi được lưu trữ trên một máy chủ trong phòng thí nghiệm của chúng tôi (nhiều RAID, tôi tin) và được gắn nfs. Bạn có ý nghĩa gì bởi "giới hạn lịch sử vỏ tùy ý"? Tất cả điều này xảy ra tốt bên dưới HISTSIZE và HISTFILESIZE, và mặc dù tôi đã đặt cả hai, nhưng chúng cũng nằm dưới intbash lưu trữ chúng như.
Cascabel

Tôi phải nói rằng mục nhập của David Mackffy có lẽ là những gì đang xảy ra.
Axxmasterr

1
Tôi hoàn toàn chắc chắn rằng nó không phải là. Tôi không bao giờ nên kết thúc chỉ với hai lệnh trong lịch sử của mình, khi lớp vỏ cuối cùng để thoát có vài chục lệnh, tệp lịch sử có vài trăm và HISTSIZE / HISTFILESIZE được đặt thành 10000.
Cascabel
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.