Lịch sử của bash được lưu trữ ở đâu?


95

Nếu tôi chạy history, tôi có thể thấy các lệnh thực thi mới nhất của mình.

Nhưng nếu tôi làm tail -f $HISTFILEhoặc tail -f ~/.bash_history, họ không được liệt kê.

Tập tin có bị khóa không, có vị trí tạm thời hoặc một cái gì đó tương tự không?

Câu trả lời:


117

Bash duy trì danh sách các lệnh bên trong bộ nhớ trong khi nó đang chạy. Chúng được viết vào .bash_historylối ra :

Khi một lớp 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ử vào tệp có tên $ HISTFILE

Nếu bạn muốn buộc lịch sử lệnh được viết ra, bạn có thể sử dụng history -alệnh, sẽ:

Nối các dòng lịch sử mới (các dòng lịch sử được nhập từ đầu phiên Bash hiện tại) vào tệp lịch sử.

Ngoài ra còn có một -wtùy chọn:

Viết ra lịch sử hiện tại vào tập tin lịch sử.

có thể phù hợp với bạn hơn tùy thuộc vào chính xác cách bạn sử dụng lịch sử của mình.

Nếu bạn muốn đảm bảo rằng chúng luôn được viết ngay lập tức, bạn có thể đặt lệnh đó vào PROMPT_COMMANDbiến của mình :

export PROMPT_COMMAND='history -a'

Lưu ý bên lề: nếu .bash_historytập tin của bạn vô tình trở thành sở hữu của root, mọi thứ sẽ ngừng hoạt động. Trong trường hợp đó, hãy kiểm tra quyền sở hữu và sử dụng sudođể sửa quyền sở hữu nếu cần.

13

(Không phải là một câu trả lời nhưng tôi không thể thêm ý kiến)

Nếu bạn đang kiểm tra .bash_historyvì bạn chỉ muốn xóa một lệnh cụ thể (ví dụ: xóa mật khẩu rõ ràng), bạn có thể xóa trực tiếp mục nhập trong bộ nhớ bằng cách history -d <entry_id>.

Ví dụ: giả sử một đầu ra như:

$ history
926  ll
927  cd ..
928  export --password=super_secret
929  ll

và bạn muốn thanh lọc exportdòng, bạn có thể chỉ cần đạt được nó bằng cách:

history -d 928

11

bash giữ nó trong bộ nhớ làm việc, bash có thể được cấu hình để lưu nó khi bash đóng hoặc sau mỗi lệnh và được tải khi bash bắt đầu hoặc theo yêu cầu.

Nếu bạn định cấu hình để lưu sau mỗi lệnh, thì hãy xem xét hàm ý của việc có nhiều bash chạy cùng một lúc. (dòng lệnh sẽ được xen kẽ)


2
Câu trả lời bắt đầu của bạn làm cho nó nghe như thể lịch sử được lưu trữ trong một tệp có tên là bash, hoặc thậm chí trong bashexetable. Tôi sẽ viết "Nó được lưu trữ bashtrong bộ nhớ, ..."
Anthon

điều đó thực sự tốt hơn
Anthon

5

Các lệnh được lưu trong bộ nhớ (RAM) trong khi phiên của bạn đang hoạt động. Ngay khi bạn đóng shell, danh sách lệnh sẽ được ghi vào .bash_historytrước khi tắt máy.

Vì vậy, bạn sẽ không thấy lịch sử của phiên hiện tại .bash_history.


4
Tệp lịch sử được cập nhật khi bashchấm dứt, không ngụ ý khởi động lại (đặc biệt là trong môi trường đồ họa nơi bạn có thể mở và đóng các thiết bị đầu cuối theo ý muốn).
John WH Smith

4

Trong khi chạy, lịch sử chỉ được lưu trong bộ nhớ (theo mặc định) nếu:

  • set -o history (an Hin echo "$-") được đặt.
  • LỊCH SỬ không phải là 0
  • HISTIGNORE không phải *(hoặc một số mẫu rất hạn chế khác).

Nếu bất kỳ điều nào ở trên không thành công, không có lịch sử nào được lưu trong bộ nhớ và do đó không có lịch sử nào có thể hoặc sẽ được ghi vào đĩa.

Lịch sử trong bộ nhớ được ghi vào đĩa nếu:

  • LỊCH SỬ không phải là 0
  • HISTFILE không được đặt.

Nhưng chỉ khi shell thoát hoặc nếu các lệnh history -a(chắp thêm) hoặc history -w(ghi) được thực thi.

Để kích hoạt ghi ngay vào đĩa, bạn có thể sử dụng biến:

 PROMPT_COMMAND='history -a'

đó sẽ appendnewdòng lịch sử đến tập tin lịch sử. Đây là những dòng lịch sử được nhập từ đầu phiên bash hiện tại, nhưng chưa được thêm vào tệp lịch sử.

Hoặc là:

 PROMPT_COMMAND='history -w'

Để ghi đè lên lịch sử trong HISTFILE với danh sách từ bộ nhớ.

Vì vậy, bạn có thể xóa một lệnh khỏi lịch sử trong bộ nhớ:

 $ history 5
  6359  ls
  6360  cd ..
  6361  comand --private-password='^%^&$@#)!@*'
  6362  top
  6363  set +o | less
 $ history -d 6361
 $ history 5
  6359  ls
  6360  cd ..
  6361  top
  6362  set +o | less
 $ history -w

Và ghi nó vào đĩa bằng lệnh cuối cùng:

 history -w    # with `shopt -u histappend` unset

Sẽ có bất cứ điều gì sai bằng cách đặt điều này trong một công việc định kỳ? Tôi nghi ngờ rằng rất nhiều người dùng có ít tên người dùng đang đăng nhập vào một máy chủ cụ thể và lịch sử vẫn còn khá nhỏ và đây là một máy chủ cũ, nhưng có thể một số phiên không bao giờ bị đóng ...
oneindelijk
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.