[mikeserv@localhost ~]$ PS1=$PS1'$(
[ ${last_hist=\!} -ne \! ] && {
h=$(history 1)
[ -n "${h#"${h##* cd *}"}" ] &&
. ./.dircmd >&2 2>/dev/null
})${0##*["$0"$((last_hist=\!))]*}'
[mikeserv@localhost ~]$ cd .
[mikeserv@localhost ~]$
[mikeserv@localhost ~]$ echo
[mikeserv@localhost ~]$ cat <<\DIRCMD >.dircmd
echo this is my home directory
> DIRCMD
[mikeserv@localhost ~]$
[mikeserv@localhost ~]$ echo
[mikeserv@localhost ~]$ cd .
this is my home directory
[mikeserv@localhost ~]$
Một cái gì đó như thế sẽ hoạt động cho một hệ thống POSIX - mặc dù tôi nghĩ chỉ bashyêu cầu \ dấu gạch chéo ngược trước! Bang như thế. bashdường như cũng cập nhật lịch sử theo cách không hoạt động fc- có thể mang theo - nhưng không hoạt động history. Trong các shell khác, history 1bit nên được trao đổi với fc -l -1nhưng bashnó là một lệnh phía sau, tôi đoán vậy. Đó là khá bực bội.
Dù sao, mỗi khi rút ra dấu nhắc, nó xác định biến $last_histlà số lịch sử cho lệnh cuối cùng. Nó thực hiện điều này trong trường khớp trên một thay thế tham số sẽ luôn luôn không có gì để không hiển thị trong lời nhắc.
Các fckiểm tra chỉ làm cho chắc chắn rằng số lịch sử cuối cùng thực sự tăng lên - như trong, bạn không chỉ nhấn Enter hoặc bất cứ điều gì. Nó cũng kiểm tra lệnh cuối cùng là a cd. Nếu cả hai đều đúng, nó sẽ cố gắng tìm .một tệp trong thư mục hiện tại có tên .dircmd. Nếu nó tồn tại, nó chạy. Nếu không, oh tốt.
Ruby