bash HISTSIZE so với HISTFILESIZE?


174

Sự khác biệt trong HISTSIZEso với là HISTFILESIZEgì?

Chúng được sử dụng để mở rộng lịch sử bash vượt quá 500 dòng mặc định.

Dường như không có sự rõ ràng ở đây và trong các diễn đàn khác về lý do tại sao cả hai đều cần thiết. ( Ví dụ 1 , ví dụ 2 , ví dụ 3 ).

Câu trả lời:


289

Câu trả lời ngắn:

HISTSIZE là số lượng dòng hoặc lệnh được lưu trữ trong bộ nhớ trong danh sách lịch sử trong khi phiên bash của bạn đang diễn ra.

HISTFILESIZE là số dòng hoặc lệnh mà (a) được phép trong tệp lịch sử tại thời điểm khởi động của phiên và (b) được lưu trữ trong tệp lịch sử vào cuối phiên bash của bạn để sử dụng trong các phiên trong tương lai.

Lưu ý phân biệt giữa file: trên đĩa - và list: trong bộ nhớ.

Câu trả lời dài:

Tất cả các thông tin trên + một số ví dụ:

Ví dụ 1 : HISTFILESIZE=10HISTSIZE=10

  1. Bạn bắt đầu phiên của bạn.
  2. HISTFILE của bạn (tệp lưu trữ lịch sử lệnh bash của bạn), bị cắt ngắn để chứa HISTFILESIZE = 10 dòng.
  3. Bạn viết 50 dòng.
  4. Khi kết thúc 50 lệnh của bạn, chỉ các lệnh từ 41 đến 50 nằm trong danh sách lịch sử của bạn, có kích thước được xác định bởi HISTSIZE = 10.
  5. Bạn kết thúc phiên của bạn.
  6. Giả sử histappendkhông được bật, các lệnh từ 41 đến 50 được lưu vào HISTFILE của bạn, hiện có 10 lệnh được giữ ở đầu cộng với 10 lệnh mới được viết.
  7. HISTFILE của bạn bị cắt ngắn để chứa HISTFILESIZE = 10 dòng.
  8. Bây giờ bạn có 10 lệnh trong lịch sử của mình - 10 lệnh cuối cùng mà bạn vừa nhập vào phiên bạn vừa hoàn thành.
  9. Khi bạn bắt đầu một phiên mới, bạn bắt đầu lại từ 1 với HISTFILE HISTFILESIZE = 10.

Ví dụ 2 : HISTFILESIZE=10HISTSIZE=5

  1. Bạn bắt đầu phiên của bạn.
  2. HISTFILE của bạn (tệp lưu trữ lịch sử lệnh bash của bạn), bị cắt ngắn để chứa tối đa HISTFILESIZE = 10 dòng.
  3. Bạn viết 50 dòng.
  4. Khi kết thúc 50 lệnh của bạn, chỉ các lệnh 46 đến 50 nằm trong danh sách lịch sử của bạn, có kích thước được xác định bởi HISTSIZE = 5.
  5. Bạn kết thúc phiên của bạn.
  6. Giả sử histappendkhông được bật, các lệnh 46 đến 50 được lưu vào HISTFILE của bạn, hiện có 10 lệnh được giữ ở đầu cộng với 5 lệnh mới được viết.
  7. HISTFILE của bạn bị cắt ngắn để chứa HISTFILESIZE = 10 dòng.
  8. Bây giờ bạn có 10 lệnh trong lịch sử của mình - 5 từ một phiên trước đó và 5 lệnh cuối cùng mà bạn vừa nhập vào phiên bạn vừa hoàn thành.
  9. Khi bạn bắt đầu một phiên mới, bạn bắt đầu lại từ 1 với HISTFILE HISTFILESIZE = 10.

Ví dụ 3 : HISTFILESIZE=5HISTSIZE=10

  1. Bạn bắt đầu phiên của bạn.
  2. HISTFILE của bạn (tệp lưu trữ lịch sử lệnh bash của bạn), bị cắt ngắn để chứa tối đa HISTFILESIZE = 5 dòng.
  3. Bạn viết 50 dòng.
  4. Khi kết thúc 50 lệnh của bạn, chỉ các lệnh từ 41 đến 50 nằm trong danh sách lịch sử của bạn, có kích thước được xác định bởi HISTSIZE = 10.
  5. Bạn kết thúc phiên của bạn.
  6. Giả sử histappendkhông được bật, các lệnh từ 41 đến 50 được lưu vào HISTFILE của bạn, hiện có 5 lệnh được giữ ở đầu cộng với 10 lệnh mới được viết.
  7. HISTFILE của bạn bị cắt ngắn để chứa HISTFILESIZE = 5 dòng.
  8. Bây giờ bạn có 5 lệnh trong lịch sử của mình - 5 lệnh cuối cùng mà bạn vừa nhập vào phiên bạn vừa hoàn thành.
  9. Khi bạn bắt đầu một phiên mới, bạn bắt đầu lại ở bước 1 với HISTFILE của HISTFILESIZE = 5.

Thông tin từ elixir_sinari :

"Tệp" lịch sử không được cập nhật khi bạn nhập lệnh. Các lệnh được lưu trữ trong một "danh sách" riêng biệt (được truy cập bởi lệnh history). Số lượng các lệnh được lưu trữ này được kiểm soát bởi giá trị HISTSIZE. Khi hệ vỏ (tương tác) thoát ra, các dòng $ HISTSIZE cuối cùng được sao chép / gắn vào $ HISTFILE từ "danh sách" đó. Nếu HISTFILESIZE được đặt, thì sau thao tác này, đảm bảo rằng chỉ có các dòng $ HISTFILESIZE (mới nhất) tồn tại trong $ HISTFILE. Và khi shell bắt đầu, "danh sách" được khởi tạo từ $ HISTFILE cho đến tối đa các lệnh $ HISTSIZE.

Và từ man bashtrang:

Giá trị của biến HISTSIZE được sử dụng làm số lượng lệnh cần lưu trong danh sách lịch sử. Văn bản của các lệnh HISTSIZE cuối cùng (mặc định 500) được lưu. (...)

Khi khởi động, lịch sử được khởi tạo từ tệp được đặt tên bởi biến HISTFILE (mặc định ~ / .bash_history). Tệp được đặt tên theo giá trị của HISTFILE bị cắt ngắn, nếu cần, để chứa không quá số lượng dòng được chỉ định bởi giá trị của HISTFILESIZE. (...) Khi một vỏ tương tác thoát ra, các dòng $ HISTSIZE cuối cùng được sao chép từ danh sách lịch sử sang $ HISTFILE. 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 đè. Nếu HISTFILE không được đặt hoặc nếu tệp lịch sử không thể ghi được, lịch sử sẽ không được lưu. (...) Sau khi lưu lịch sử, tệp lịch sử bị cắt ngắn để chứa không quá dòng HISTFILESIZE. Nếu HISTFILESIZE không được đặt,


27
+1 Câu trả lời này rất ấn tượng! Một chút quá nhiều, tôi nghĩ. Hầu hết mọi người sẽ không đi đến cuối của nó. Tôi nghĩ bạn nên xem xét tóm tắt nó
slezica

22
@slezica Tôi không đồng ý với phần thứ hai của bình luận của bạn: Tôi đã đạt đến cuối của nó và tôi có thể nói rằng mọi thông tin trong câu trả lời đều hữu ích. Thực tế là một số người quá lười biếng để đọc một vài dòng không nên biện minh cho việc xóa thông tin hữu ích cho những người khác.
Bastien

1
@Bastien giả sử bạn là một trình phân tích cú pháp dấu đầu dòng, bạn sẽ không gặp khó khăn gì khi đọc phần này.
Pithikos

6
Hãy nhìn xem, ổ cứng của tôi là 1 TB và hầu như trống rỗng, và tôi có một số lượng lớn các chu kỳ CPU và RAM nhàn rỗi, và tôi muốn lưu lại lịch sử bash càng nhiều càng tốt - vì vậy khi tôi cần tìm kiếm lệnh ngu ngốc đó Tôi chạy trong hai năm, tôi biết đó là trong lịch sử bash của tôi. Để làm cho nó cụ thể hơn, hãy nói tới 50 MB lịch sử bash. Những giá trị nào bạn đề nghị?
CivilFan

2
@Matthew xin lỗi, không biết điều đó!
arturomp

6

Xây dựng trên những gì arturomp đã nói và trong một nỗ lực để làm cho nó rõ ràng hơn một chút.

Giả sử bạn có 2000 lịch sử lâu dài ..

~$ history
    1  sdf
    2  fghdfgjf
    3  fghfghdf
   ..  ..
 2027  78
 2028  57
 2029  yu45u

Bạn có thể cắt giảm những gì bạn được hiển thị với HISTSIZE

~$ HISTSIZE=5
~$ history
 2026  546
 2027  78
 2028  56
 2029  yu45u
 2030  HISTSIZE=5

Bây giờ, cho dù bạn nhập bao nhiêu lệnh, chỉ 5 lệnh cuối cùng sẽ được ghi lại.

~$ ABC
~$ GGH
~$ GSDHFG
~$ JFDR
~$ ABSDDS
~$ AHFGHFD
<close terminal>
<open new terminal>
~$ history
    1  sdf
    2  fghdfgjf
    3  fghfghdf
   ..  ..
 2028  56
 2029  yu45u
 2030  HISTSIZE=5
 2031  GGH
 2032  GSDHFG
 2033  JFDR
 2034  ABSDDS
 2035  AHFGHFD

Chúng ta có thể thấy rõ rằng lệnh đầu tiên của chúng tôi ("ABC") không có trong lịch sử vì chỉ có 5 lệnh cuối cùng được ghi lại.

Bây giờ, tổng lịch sử được lưu trữ trong một tệp ( .bash_history) và bạn có thể thay đổi thời gian tệp này có trong HISTFILESIZE. Ví dụ với a 2033 HISTFILESIZE, trong trường hợp của tôi, tôi sẽ có điều này:

~$ history
    1  fghfghdf
    2  gegege
    3  gege
   ..  ..
 2028  HISTSIZE=5
 2029  GGH
 2030  GSDHFG
 2031  JFDR
 2032  ABSDDS
 2033  AHFGHFD

3
Những giá trị nào bạn muốn giới thiệu nếu tôi muốn tất cả lịch sử từ tất cả các thiết bị đầu cuối đồng thời được lưu vào lịch sử bash mãi mãi ? Nói cách khác, lưu tất cả mọi thứ, luôn luôn và không bao giờ xóa bất cứ điều gì.
CivilFan

10
@CivFan: Đặt HISTSIZE=-1HISTFILESIZE=-1.
M. Dudley

2
Đây là sai lầm chết người. Đặt nó thành -1 sẽ xóa mọi thứ.
Brendan Byrd

3
@BrendanByrd bashTrang người đàn ông nói: Non-numeric values and numeric values less than zero inhibit truncationnhưng sau đó tôi không đủ can đảm để kiểm tra xem điều này có đúng không vì tôi không muốn làm mất lịch sử của mình :-)
SebMa

3
@SebMa Tôi đã thay đổi cài đặt của mình thành HISTSIZE='INFINITY'HISTFILESIZE='ANDBEYOND'. Vì chúng không phải là số nên chúng lưu mọi thứ. Cảm ơn vì tiền hỗ trợ!
Connor
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.