PROMPT_COMMAND có thể chứa các câu lệnh bash thông thường trong khi biến PS1 cũng có thể chứa các ký tự đặc biệt, chẳng hạn như '\ h' cho tên máy chủ, trong biến.
Ví dụ ở đây là lời nhắc bash của tôi sử dụng cả PROMPT_COMMAND và PS1. Mã bash trong PROMPT_COMMAND tìm ra nhánh git mà bạn có thể đang ở và hiển thị nhánh đó tại lời nhắc, cùng với trạng thái thoát của quá trình chạy cuối cùng, tên máy chủ và tên cơ sở của pwd. Biến RET lưu trữ giá trị trả về của chương trình được thực thi cuối cùng. Điều này thuận tiện để xem liệu có lỗi không và mã lỗi của chương trình cuối cùng tôi chạy trong thiết bị đầu cuối. Lưu ý bên ngoài 'bao quanh toàn bộ biểu thức PROMPT_COMMAND. Nó bao gồm PS1 để biến này được đánh giá lại mỗi khi biến PROMPT_COMMAND được đánh giá.
PROMPT_COMMAND='RET=$?;\
BRANCH="";\
ERRMSG="";\
if [[ $RET != 0 ]]; then\
ERRMSG=" $RET";\
fi;\
if git branch &>/dev/null; then\
BRANCH=$(git branch 2>/dev/null | grep \* | cut -d " " -f 2);\
fi;
PS1="$GREEN\u@\h $BLUE\W $CYAN$BRANCH$RED$ERRMSG \$ $LIGHT_GRAY";'
Đầu ra ví dụ trông giống như thế này trong một thư mục không phải git:
sashan@dhcp-au-122 Documents $ false
sashan@dhcp-au-122 Documents 1 $
và trong thư mục git, bạn thấy tên chi nhánh:
sashan@dhcp-au-122 rework mybranch $
Cập nhật
Sau khi đọc các bình luận và câu trả lời của Bob, tôi nghĩ rằng viết nó như anh ấy mô tả là tốt hơn. Nó dễ bảo trì hơn những gì tôi đã viết ban đầu ở trên, trong đó biến PS1 được đặt bên trong PROMPT_COMMAND, bản thân nó là một chuỗi siêu phức tạp được đánh giá trong thời gian chạy bằng bash. Nó hoạt động, nhưng nó phức tạp hơn mức cần thiết. Công bằng mà nói, tôi đã viết PROMPT_COMMAND đó cho chính mình khoảng 10 năm trước và nó đã hoạt động và không nghĩ quá nhiều về nó.
Đối với những người tò mò về cách tôi đã sửa đổi mọi thứ của mình, về cơ bản tôi đã đặt mã cho PROMPT_COMMAND trong tệp riêng biệt (như Bob đã mô tả) và sau đó lặp lại chuỗi mà tôi định là PS1:
GREEN="\[\033[0;32m\]"
CYAN="\[\033[0;36m\]"
RED="\[\033[0;31m\]"
PURPLE="\[\033[0;35m\]"
BROWN="\[\033[0;33m\]"
LIGHT_GRAY="\[\033[0;37m\]"
LIGHT_BLUE="\[\033[1;34m\]"
LIGHT_GREEN="\[\033[1;32m\]"
LIGHT_CYAN="\[\033[1;36m\]"
LIGHT_RED="\[\033[1;31m\]"
LIGHT_PURPLE="\[\033[1;35m\]"
YELLOW="\[\033[1;33m\]"
WHITE="\[\033[1;37m\]"
RESTORE="\[\033[0m\]" #0m restores to the terminal's default colour
if [ -z $SCHROOT_CHROOT_NAME ]; then
SCHROOT_CHROOT_NAME=" "
fi
BRANCH=""
ERRMSG=""
RET=$1
if [[ $RET != 0 ]]; then
ERRMSG=" $RET"
fi
if which git &>/dev/null; then
BRANCH=$(git branch 2>/dev/null | grep \* | cut -d " " -f 2)
else
BRANCH="(git not installed)"
fi
echo "${GREEN}\u@\h${SCHROOT_CHROOT_NAME}${BLUE}\w \
${CYAN}${BRANCH}${RED}${ERRMSG} \$ $RESTORE"
và trong .bashrc của tôi
function prompt_command {
RET=$?
export PS1=$(~/.bash_prompt_command $RET)
}
PROMPT_DIRTRIM=3
export PROMPT_COMMAND=prompt_command
if git branch &>/dev/null ; then\
. Nó chuyển hướng cả stdout và stderr đến / dev / null. tldp.org/LDP/abs/html/io-redirection.html