đôi khi các lệnh lịch sử không được lưu trữ trong .bash_history


20

Tôi đã ban hành nhiều lệnh ngày hôm qua trong CentOS 7. Nhưng khi tôi muốn lấy lại các lệnh này ngày hôm nay, tôi thấy không có bất kỳ bản ghi nào. Khi tôi mở tệp .bash_history, tôi vẫn không thể tìm thấy các lệnh tôi đã ban hành ngày hôm qua nhưng tôi đã tìm thấy nhiều lệnh cũ vài ngày trước. Tại sao các lệnh gần đây không được lưu trữ? Làm thế nào tôi có thể tăng khả năng lịch sử?


Đôi khi, khi thiết bị đầu cuối bị đóng bất thường, lịch sử không được lưu, nó cũng xảy ra với tôi nhưng tôi không biết tình huống gây ra hành vi này
mazs

Câu trả lời:


11

Nguyên nhân rất có thể khiến các mục lịch sử không hiển thị không phải do cài đặt HISTFILEthành không hoặc HISTSIZEbằng 0, đó là do đăng nhập vào cùng một máy hai lần và thoát với ví dụ bash thứ hai (trong đó bạn đã làm rất ít hoặc không có gì) sau một trong đó bạn đã làm rất nhiều Theo mặc định, Bash không hợp nhất lịch sử và lối ra Bash thứ hai ghi đè lên .bash_historycái được cập nhật độc đáo bởi lối ra Bash đầu tiên.

Để ngăn điều này xảy ra, bạn có thể thêm vào tệp lịch sử thay vì ghi đè, bạn có thể sử dụng histappendtùy chọn shell:

Nếu tùy chọn shell histappend được bật (xem mô tả về shopt trong SHELL BUILTIN THÔNG TIN bên dưới), các dòng được gắn vào tệp lịch sử, nếu không, tệp lịch sử sẽ bị ghi đè.

Xem thêm chi tiết trong câu trả lời này bao gồm cách sử dụng HISTSIZE, HISTFILESIZEHISTCONTROLđể kiểm soát kích thước, bản sao, vv


3

Để sửa đổi kích thước lịch sử, sử dụng hai biến BASH HISTSIZE, HISTFILESIZE(thường được đặt trong .bashrc).

Mô tả từ trang BASH man:

HISTSIZE Số lệnh để nhớ trong lịch sử lệnh (xem LỊCH SỬ dưới đây). Nếu giá trị là 0, các lệnh không được lưu trong danh sách lịch sử. Giá trị số nhỏ hơn 0 kết quả trong mỗi lệnh được lưu trong danh sách lịch sử (không có giới hạn). Shell đặt giá trị mặc định là 500 sau khi đọc bất kỳ tệp khởi động nào.

HISTFILESIZE Số lượng dòng tối đa có trong tệp lịch sử. Khi biến này được gán một giá trị, tệp lịch sử sẽ được kiểm tra, nếu cần, để chứa không quá số dòng đó bằng cách xóa các mục cũ nhất. Tệp lịch sử cũng bị cắt ngắn theo kích thước này sau khi ghi nó khi thoát khỏi trình bao. Nếu giá trị là 0, tệp lịch sử bị cắt ngắn về kích thước không. Các giá trị không phải là số và giá trị số nhỏ hơn 0 sẽ ngăn chặn việc cắt bớt. Shell đặt giá trị mặc định thành giá trị của HISTSIZE sau khi đọc bất kỳ tệp khởi động nào.

Để làm ví dụ, tôi có thiết lập sau trong .bashrctệp của mình :

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

1

Tôi đã có điều này xảy ra nhưng giải pháp không được liệt kê ở đây. Nguyên nhân chỉ là một vấn đề sao chép + dán đơn giản. Tôi đã sao chép một lệnh từ một tài liệu khác và tôi có thêm một khoảng trắng trên bảng tạm. Vì một số lý do, điều này khiến Ubuntu không lưu lệnh vào tệp lịch sử.

nhập mô tả hình ảnh ở đây

Hình ảnh trên là lệnh tôi có trong tài liệu biểu mẫu google của tôi. Lệnh này đã chạy nhưng đã bị bỏ qua trong lịch sử của tôi. Tôi chỉ quay lại và chọn lệnh không có khoảng trắng và sau đó nó xuất hiện trong lịch sử bash.


5
Một trong các tùy chọn lịch sử là bỏ qua (không lưu) các dòng bắt đầu bằng dấu cách. Nó thường được mặc định là bật. Điều này có thể được thay đổi trong .bashrc của bạn.
sinh

1

Verifiy rằng của bạn HISTCONTROL biến môi trường không được đặt thành ignorespacehoặc ignoreboth.

$ echo $HISTCONTROL
ignoredups  #this is ok

Bạn có thể sửa đổi nó bằng cách đặt giá trị trong ~/.bash_profile~/.profile tệp của bạn hoặc của bạn :

HISTCONTROL=ignoredups

Từ bashtrang nam:

LỊCH SỬ

Một danh sách các giá trị được phân tách bằng dấu hai chấm kiểm soát cách các lệnh được lưu trong danh sách lịch sử.

Nếu danh sách các giá trị bao gồm ignorespace , các dòng bắt đầu bằng ký tự khoảng trắng sẽ không được lưu trong danh sách lịch sử.

Giá trị của ignoredups dòng nguyên nhân khớp với mục lịch sử trước đó sẽ không được lưu.

Giá trị của tốc ignorebothký là ignorespaceignoredups .

Giá trị của erasedups tất cả các dòng trước khớp với dòng hiện tại sẽ bị xóa khỏi danh sách lịch sử trước khi dòng đó được lưu.

Bất kỳ giá trị không có trong danh sách trên được bỏ qua.

Nếu HISTCONTROL không được đặt hoặc không bao gồm giá trị hợp lệ, tất cả các dòng được đọc bởi trình phân tích cú pháp shell được lưu trong danh sách lịch sử, tuân theo giá trị của HISTIGNORE. Các dòng thứ hai và tiếp theo của lệnh ghép nhiều dòng không được kiểm tra và được thêm vào lịch sử bất kể giá trị của HISTCONTROL.

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.