Nội dung của tệp .bash_history kéo dài bao lâu?


11

Làm thế nào tôi có thể sửa đổi nội dung của bash_historytập tin của tôi ? Những giá trị hoặc biến nào kiểm soát lịch sử kéo dài bao lâu? Có điều gì khác tôi có thể thay đổi để cung cấp quyền kiểm soát tốt hơn về lịch sử BASH của mình không ??



2
Tôi không tin rằng tệp này được kiểm soát theo thời gian, nhưng đúng hơn là kích thước cuối cùng của tệp. Xem ở đây: Có cách nào để đặt kích thước của danh sách lịch sử trong bash thành hơn 5000 dòng không? . Vì vậy, env. các biến HISTSIZEHISTFILESIZElà các bề mặt kiểm soát duy nhất mà bạn phải kiểm soát bao nhiêu lịch sử được duy trì.
slm

Câu trả lời:


12

Có hai biến kiểm soát kích thước lịch sử:

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ẽ bị cắt ngắn, 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ỊCH SỬ Số lượng các lệnh cần nhớ trong lịch sử lệnh (xem LỊCH SỬ bên dưới). 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.

Hai biến này cho phép bạn kiểm soát hành vi của lịch sử của bạn. Về cơ bản, HISTSIZElà số lượng lệnh được lưu trong phiên hiện tại của bạn và HISTFILESIZElà số lượng lệnh sẽ được ghi nhớ trong các phiên. Ví dụ:

$ echo $HISTSIZE 
10
$ echo $HISTFILESIZE 
5
$ history | wc
     10      29     173

Trong ví dụ trên, vì HISTSIZEđược đặt thành 10, historytrả về danh sách 10 lệnh. Tuy nhiên, nếu bạn đăng xuất và sau đó đăng nhập lại, historysẽ chỉ trả về 5 lệnh vì HISTFILESIZEđược đặt thành 5. Điều này là do, khi bạn thoát phiên, HISTFILESIZEdòng lịch sử của bạn được lưu vào tệp lịch sử của bạn ( ~/.bash_historytheo mặc định nhưng được kiểm soát bởi HISTFILE). Nói cách khác, các lệnh được thêm vào cho HISTFILEđến khi đạt đến $HISTFILESIZEcác dòng tại điểm đó, mỗi dòng tiếp theo được thêm vào có nghĩa là lệnh đầu tiên của tệp sẽ bị xóa.

Bạn có thể đặt giá trị của các biến này trong ~/.profile(hoặc ~/.bash_profilenếu tệp đó tồn tại). Không đặt chúng ở vị trí ~/.bashrcđầu tiên của bạn vì chúng không có doanh nghiệp nào được đặt ở đó và thứ hai vì điều đó sẽ khiến bạn có hành vi khác nhau trong đăng nhập so với vỏ không đăng nhập có thể dẫn đến các vấn đề khác .

Các biến hữu ích khác cho phép bạn tinh chỉnh hành vi của lịch sử của bạn là:

  • HISTIGNORE: Điều này cho phép bạn bỏ qua một số lệnh phổ biến hiếm khi được quan tâm. Ví dụ: bạn có thể đặt:

    export HISTIGNORE="pwd:df:du"

    Điều đó sẽ gây ra bất kỳ lệnh bắt đầu với pwd, dfhoặc dusẽ bị loại bỏ và không được lưu trong lịch sử của bạn.

  • HISTCONTROL: Cái này cho phép bạn chọn cách lịch sử hoạt động. Cá nhân, tôi đặt nó HISTCONTROL=ignoredupslàm cho nó lưu các lệnh trùng lặp chỉ một lần. Các tùy chọn khác là ignorespacebỏ qua các lệnh bắt đầu bằng khoảng trắng và erasedupsđiều này làm cho tất cả các dòng trước khớp với dòng hiện tại bị xóa khỏi danh sách lịch sử trước khi dòng đó được lưu. ignorebothlà tốc ký cho không gian và bỏ qua.

  • HISTTIMEFORMAT: Điều này cho phép bạn đặt định dạng thời gian của tệp lịch sử. Xem câu trả lời của Pandya hoặc đọc man bashđể biết chi tiết.


Để tinh chỉnh hơn nữa, bạn có:

  • Các histappendtùy chọn bash. Điều này có thể được thiết lập bằng cách chạy shopt -s histappendhoặc thêm lệnh đó vào của bạn ~/.bashrc. Nếu tùy chọn này được đặt

    danh sách lịch sử được gắn vào tệp được đặt tên theo giá trị của biến HISTFILE khi shell thoát, thay vì ghi đè lên tệp.

    Điều này rất hữu ích vì nó cho phép bạn kết hợp lịch sử của các phiên khác nhau (ví dụ như các thiết bị đầu cuối khác nhau).

  • Các historylệnh có hai tùy chọn hữu ích:

    • history -a : làm cho lệnh cuối cùng được ghi vào tệp lịch sử

    • history -r : nhập tệp lịch sử vào phiên hiện tại.

    Ví dụ, bạn có thể thêm hai lệnh này vào lệnh PROMPT_COMMAND(được thực thi mỗi khi trình bao của bạn hiển thị lời nhắc, vì vậy bất cứ khi nào bạn khởi động trình bao mới và sau mỗi lệnh bạn chạy trong đó):

    export PROMPT_COMMAND='history -a;history -r;'

    Kết hợp lại, họ đảm bảo rằng bất kỳ thiết bị đầu cuối mới nào bạn mở sẽ ngay lập tức nhập lịch sử của bất kỳ phiên shell nào khác. Kết quả là một lịch sử chung trên tất cả các thiết bị đầu cuối / phiên vỏ.


2

Kích thước mặc định của tệp lịch sử là 500 dòng. Khi tệp .bash_history đạt tới 500 dòng, các mục nhập ban đầu sẽ bị loại bỏ để nhường chỗ cho các dòng mới hơn, như trong FIFO. Bạn có thể thay đổi điều này bằng cách thay đổi giá trị của biến HISTFILESIZEmà theo mặc định có giá trị 500.

Đặt một HISTFILESIZE=10000.bashrc của bạn sẽ tăng số lượng dòng mà tệp lịch sử có thể chứa lên 10000, do đó làm tăng tuổi thọ của nội dung của nó.


2
lưu ý: nếu bạn tăng HISTSIZEgiới hạn, hãy cân nhắc thay đổi HISTFILE. Nếu bạn chạy bash --norc HISTSIZEsẽ quay trở lại giá trị mặc định, cắt ngắn HISTFILEkhi thoát.
llua

Cảm ơn, @llua. Tương tự, nếu hệ thống của bạn /etc/bash.bashrcđặt một HISTFILESIZE(hoặc có thể HISTSIZE; tôi chưa kiểm tra cái nào), thì Bash dường như cắt ngắn .bash_historytại điểm nó đọc /etc/bash.bashrc(hoặc ít nhất là tại một số điểm trước khi giới hạn mới của bạn được đặt trong các tệp Bash init của riêng bạn). Để tránh điều này, một lần nữa, hãy đặt riêng của bạn HISTFILEđể lịch sử thực sự của bạn đến đó và không vào .bash_historytệp mà Bash đang cắt ngắn.
Chris Povirk

(Nhưng đừng exportnó, vì làm như vậy sẽ làm cho nó có thể nhìn thấy bất kỳ vỏ con, mà sau đó có thể xem xét để cắt ngắn nó thay vì .bash_history!)
Chris Povirk

0

Đọc man bashđể biết thêm chi tiết về lịch sử bash như:

HISTCONTROL
       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 khoảng trống, các dòng bắt đầu bằng ký tự khoảng trắng là
       không được lưu trong danh sách lịch sử. Giá trị của bỏ qua gây ra các dòng khớp với trước đó
       mục lịch sử để không được lưu. Giá trị của ignboth là tốc ký cho không gian và
       bỏ qua. Giá trị bị xóa khiến tất cả các dòng trước khớp với dòng hiện tại
       được xóa khỏi danh sách lịch sử trước khi dòng đó được lưu. Bất kỳ giá trị nào không ở trên
       danh sách bị 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 bởi trình phân tích cú pháp shell được lưu trong danh sách lịch sử, tùy theo giá trị của HISTIG‐
       KHÔNG LÀM LẠI. 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.
LỊCH SỬ
       Tên của tệp trong đó lịch sử lệnh được lưu (xem LỊCH SỬ bên dưới). Mặc định
       giá trị là ~ / .bash_history. Nếu không được đặt, lịch sử lệnh sẽ không được lưu khi thoát khỏi trình bao.
LỊCH SỬ
       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ử bị cắt bớt, nếu cần, không chứa nhiều hơn số đó
       của dòng bằng cách loại bỏ các mục cũ nhất. Các tập tin lịch sử cũng được cắt ngắn đến kích thước này
       sau khi viết nó khi một cái vỏ thoát ra. Nếu giá trị là 0, tệp lịch sử bị cắt ngắn thành
       kích thước bằng 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. Các
       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ỊCH SỬ
       Một danh sách các mẫu được phân tách bằng dấu hai chấm được sử dụng để quyết định dòng lệnh nào sẽ được lưu trên
       danh sách lịch sử. Mỗi mẫu được neo ở đầu dòng và phải khớp
       dòng hoàn chỉnh (không có `* 'ẩn được thêm vào). Mỗi mẫu được kiểm tra đối với dòng
       sau khi kiểm tra được chỉ định bởi HISTCONTROL được áp dụng. Ngoài vỏ bình thường
       các ký tự khớp mẫu, `& 'khớp với dòng lịch sử trước đó. `& 'có thể được thoát
       sử dụng dấu gạch chéo ngược; dấu gạch chéo ngược được loại bỏ trước khi thử khớp. Thứ hai và
       các dòng 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 HISTIGNORE.
LỊCH SỬ
       Số lượng các lệnh cần nhớ trong lịch sử lệnh (xem LỊCH SỬ bên dưới). 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
       dẫn đến mọi lệnh được lưu trong danh sách lịch sử (không có giới hạn). Vỏ
       đặt giá trị mặc định thành 500 sau khi đọc bất kỳ tệp khởi động.
HISTTIMEFORMAT
       Nếu biến này được đặt và không null, giá trị của nó được sử dụng làm chuỗi định dạng cho strftime (3)
       để in dấu thời gian liên quan đến từng mục lịch sử được hiển thị theo lịch sử
       được xây dựng trong. Nếu biến này được đặt, tem thời gian được ghi vào tệp lịch sử để chúng có thể
       được bảo quản qua các phiên vỏ. Điều này sử dụng ký tự nhận xét lịch sử để phân biệt
       dấu thời gian guish từ dòng lịch sử khác.

Đặc biệt HISTFILESIZEHISTSIZEcó thể bạn đang tìm kiếm và giúp bạn.

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.