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 $HISTFILE
hoặ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?
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 $HISTFILE
hoặ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:
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_history
lố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 -a
lệ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 -w
tù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_COMMAND
biến của mình :
export PROMPT_COMMAND='history -a'
(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_history
vì 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 export
dòng, bạn có thể chỉ cần đạt được nó bằng cách:
history -d 928
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ẽ)
bash
exetable. Tôi sẽ viết "Nó được lưu trữ bash
trong bộ nhớ, ..."
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_history
trướ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
.
bash
chấ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).
Trong khi chạy, lịch sử chỉ được lưu trong bộ nhớ (theo mặc định) nếu:
H
in echo "$-"
) được đặt.0
và*
(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:
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ẽ append
là new
dò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
.bash_history
tậ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ụngsudo
để sửa quyền sở hữu nếu cần.