Bằng cách kết nối với PROMPT_COMMAND của bash, chức năng này sẽ được chạy mỗi khi bạn nhận được lời nhắc mới, vì vậy đây là thời điểm thích hợp để kiểm tra xem bạn có đang ở trong thư mục mà bạn muốn có lịch sử tùy chỉnh không. Hàm này có bốn nhánh chính:
- Nếu thư mục hiện tại (
$PWD
) không thay đổi, thì không làm gì cả (trả về).
Nếu PWD đã thay đổi, thì chúng tôi sẽ thiết lập một hàm cục bộ với mục đích duy nhất là đưa mã "thư mục tùy chỉnh" vào một nơi. Bạn sẽ muốn thay thế các thư mục kiểm tra của tôi bằng các thư mục của riêng bạn (cách nhau |
).
- Nếu chúng ta không thay đổi thành hoặc thoát khỏi một thư mục tùy chỉnh, thì chỉ cần cập nhật biến "thư mục trước" và trả về hàm.
Vì chúng tôi đã thay đổi thư mục, cập nhật biến "thư mục trước", sau đó lưu lịch sử trong bộ nhớ ra HISTFILE, sau đó xóa lịch sử trong bộ nhớ.
Nếu chúng tôi đã thay đổi thành một thư mục tùy chỉnh, thì hãy đặt HISTFILE thành một .bash_history
tệp trong thư mục hiện tại.
Nếu không, chúng tôi đã thay đổi ra khỏi một thư mục tùy chỉnh, vì vậy reset HISTFILE đến một trong những cổ phiếu.
Cuối cùng, vì chúng tôi đã thay đổi các tệp lịch sử, hãy đọc lại lịch sử trước đó.
Để thực hiện mọi thứ, tập lệnh sẽ đặt giá trị PROMPT_COMMAND và lưu hai biến sử dụng nội bộ (HISTFILE stock và "thư mục trước").
prompt_command() {
# if PWD has not changed, just return
[[ $PWD == $_cust_hist_opwd ]] && return
function iscustom {
# returns 'true' if the passed argument is a custom-history directory
case "$1" in
( */tmp/faber/somedir | */tmp/faber/someotherdir ) return 0;;
( * ) return 1;;
esac
}
# PWD changed, but it's not to or from a custom-history directory,
# so update opwd and return
if ! iscustom "$PWD" && ! iscustom "$_cust_hist_opwd"
then
_cust_hist_opwd=$PWD
return
fi
# we've changed directories to and/or from a custom-history directory
# save the new PWD
_cust_hist_opwd=$PWD
# save and then clear the old history
history -a
history -c
# if we've changed into or out of a custom directory, set or reset HISTFILE appropriately
if iscustom "$PWD"
then
HISTFILE=$PWD/.bash_history
else
HISTFILE=$_cust_hist_stock_histfile
fi
# pull back in the previous history
history -r
}
PROMPT_COMMAND='prompt_command'
_cust_hist_stock_histfile=$HISTFILE
_cust_hist_opwd=$PWD