Làm thế nào để: Lịch sử Bash / shell không giới hạn?


83

Có cách nào để xác định một lịch sử không giới hạn ở Bash không?

Câu trả lời:


82

Thêm phần này vào .bashrc(Linux) hoặc .bash_profile(MacOS):

export HISTFILESIZE=
export HISTSIZE=

Có bạn đi, lịch sử không giới hạn. Hiện tại tôi có 27000 mục :)

Từ man bash:

Nếu HISTFILESIZEkhông được đặt, không thực hiện cắt ngắn.

Điều đó có nghĩa .bash_historylà không bao giờ bị cắt ngắn

Ngoài ra, điều tương tự cũng áp dụng cho HISTSIZE, mặc dù tôi không thể tìm thấy tài liệu đó.

Một tính năng thú vị khác mà tôi sẽ thử là:

Nếu HISTTIMEFORMATbiến được đặt, tem thời gian được ghi vào tệp lịch sử, được đánh dấu bằng ký tự nhận xét lịch sử, để chúng có thể được lưu giữ trong các phiên shell, như sau:

export HISTTIMEFORMAT="%F %T "

Hãy cho tôi biết nếu bạn đã thử nó ...


3
Điều này không thực sự hoạt động trong nhiều trường hợp và lịch sử bash vẫn bị cắt ngắn. Xem câu trả lời của tôi dưới đây cho một giải pháp đầy đủ hơn.
fotinakis

2
Cảnh báo: điều này gây đau đầu với gdb; nếu bạn đặt một HISTSIZEbiến, nó sẽ lấy nó là 0, do đó vô hiệu hóa hoàn toàn kích thước lịch sử.
Matteo Italia

2
lưu ý: bạn không cần export, HISTFILESIZEcó số lượng dòng (không phải byte) và việc cắt bớt tệp lịch sử xảy ra khi bạn đặt biếnHISTFILESIZE (và khi thoát vỏ). Vì vậy, đừng đặt nó hai lần trong tệp cấu hình của bạn với các giá trị khác nhau ...
vaab

@vaab: nếu tôi không xuất HISTFILE, tôi không thể thấy histfile của mình đang sử dụng "echo $ HISTFILE" trong các subshells, vì vậy trong khi không cần thiết, nó có thể hữu ích và không gây hại mà tôi có thể phát hiện.
Jeff Learman

41

(đăng lại câu trả lời của tôi từ https://stackoverflow.com/a/19533853/128597 )

Sau nhiều lần lặp lại lớn, xấu xí và các trường hợp cạnh kỳ lạ trong nhiều năm qua, giờ đây tôi đã có một phần ngắn gọn của .bashrc dành riêng cho việc này.

Trước tiên, bạn phải nhận xét hoặc xóa phần này trong .bashrc (mặc định cho Ubuntu). Nếu bạn không, thì một số môi trường nhất định (như screenphiên chạy ) vẫn sẽ cắt ngắn lịch sử của bạn:

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

Thứ hai, thêm phần này vào cuối .bashrc của bạn:

# Eternal bash history.
# ---------------------
# Undocumented feature which sets the size to "unlimited".
# https://stackoverflow.com/questions/9457233/unlimited-bash-history
export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "
# Change the file location because certain bash sessions truncate .bash_history file upon close.
# http://superuser.com/questions/575479/bash-history-truncated-to-500-lines-on-each-login
export HISTFILE=~/.bash_eternal_history
# Force prompt to write history after every command.
# http://superuser.com/questions/20900/bash-history-loss
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

Lưu ý: mọi lệnh được viết ngay sau khi chạy, vì vậy nếu bạn vô tình dán mật khẩu, bạn không thể "giết -9 %%" để tránh ghi lịch sử, bạn sẽ cần xóa thủ công.

Cũng lưu ý rằng mỗi phiên bash sẽ tải tệp lịch sử đầy đủ trong bộ nhớ, nhưng ngay cả khi tệp lịch sử của bạn tăng lên 10MB (sẽ mất nhiều thời gian dài ), bạn sẽ không nhận thấy nhiều ảnh hưởng đến thời gian khởi động bash của mình.


4
Tệp lịch sử bị cắt ngắn khi bạn đặt HISTFILESIZE, đây là lý do tại sao bạn nên loại bỏ bất kỳ sự kiện nào xảy ra ngoại trừ sự kiện bạn muốn. Nó cũng sẽ bị cắt ngắn khi thoát khỏi shell (nhưng điều đó được mong đợi). Và bạn không cần export.
vaab

3
@vaab Nếu bạn không xuất, làm một cái gì đó như bash --norcsẽ cắt lại lịch sử.
Yongwei Wu

1
Tôi sử dụng export HISTFILE="/home/$USER/hist/`uname -n``tty | tr '/' '-'`"để tách lịch sử shell mỗi phiên (dựa trên tên máy chủ và tên tty). Tất nhiên tôi phải tạo thư mục ~ / hist trước.
Jeff Learman

2
Lưu ý rằng bạn có thể muốn kiểm tra giá trị của PROMPT_COMMAND và không mù quáng nối tiếp điều này nhiều lần vì nó sẽ làm những điều điên rồ cho hệ thống của bạn. Kiểm tra null hoặc tốt hơn là tìm kiếm mở rộng biến shell có thể an toàn hơn.
dragon788

3
Tôi sử dụng điều này để tránh vấn đề @ dragon788 được đề cập đến:PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND} ;}history -a";
Brian Vandenberg

9

Bao gồm trong ~ / .bashrc :

# append a session's history on shell exit
shopt -s histappend
export HISTFILESIZE=
export HISTSIZE=

Câu trả lời này thỏa mãn các tiêu chí sau:

  1. một lịch sử tổng thể riêng biệt (không phiên nào có thể làm gián đoạn lịch sử của bạn)

  2. viết lịch sử tự động (không có phím nóng)

  3. ghi không thường xuyên (không nối thêm sau mỗi lệnh)

lý lịch

Khi khởi động tương tác, nếu $HISTFILESIZEđược đặt thành một số, hãy bash cắt ngắn $HISTFILEthành số đó. Khi đóng tương tác, nếu tùy chọn shell histappendđược đặt, bash sẽ nối $HISTSIZEcác dòng vào $HISTFILE, nếu không nó sẽ ghi đè $HISTFILE.

mẹo cho OSX (Terminal)

Mỗi khi một tab được tạo trong Terminal, ~/.bash_profileđược đọc, điều đó có nghĩa là bash không tiếp tục đọc của bạn ~/.bashrc. Thêm dòng sau vào ~/etc/bash_profile:

# if bashrc has content, source it
[[ -s ~/.bashrc ]] && . ~/.bashrc

mẹo cho màn hình

Nếu bạn sử dụng màn hình, tệp cấu hình của bạn là ~ / .screenrc. Nếu bạn muốn màn hình ghi lại lịch sử, bạn chỉ cần đặt nó để sử dụng trình đăng nhập sẽ cung cấp nguồn cho các tệp khởi động bash của bạn (và ghi lại lịch sử của bạn).

# use bash, make it a login shell
defshell -bash

3

Một khái niệm khác (có thể không áp dụng được) nhưng bạn có thể có unlimitedlịch sử khi sử dụng shell-chìm .

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.