2

我编写了以下 bash 配置文件设置文件:

BLACK="\[\033[0;30m\]"
DARK_GRAY="\[\033[1;30m\]"
LIGHT_GRAY="\[\033[0;37m\]"
BLUE="\[\033[0;34m\]"
LIGHT_BLUE="\[\033[1;34m\]"
GREEN="\[\033[0;32m\]"
LIGHT_GREEN="\[\033[1;32m\]"
CYAN="\[\033[0;36m\]"
LIGHT_CYAN="\[\033[1;36m\]"
RED="\[\033[0;31m\]"
LIGHT_RED="\[\033[1;31m\]"
PURPLE="\[\033[0;35m\]"
LIGHT_PURPLE="\[\033[1;35m\]"
BROWN="\[\033[0;33m\]"
YELLOW="\[\033[1;33m\]"
WHITE="\[\033[1;37m\]"
DEFAULT_COLOR="\[\033[00m\]"


function prompt_command {
    # How many characters of the $PWD should be kept
    local pwd_length=23
    if [ $(echo -n $PWD | wc -c | tr -d " ") -gt $pwd_length ]
    then 
        newPWD="$(echo -n $PWD | sed -e "s/.*\(.\{$pwd_length\}\)/\1/")"
    else
        newPWD="$(echo -n $PWD)"
    fi
}
PROMPT_COMMAND=prompt_command;

PS1="\`if [ \$? = 0 ];
then
    echo -e '$PURPLE[\t] $LIGHT_CYAN\u$YELLOW@\h$WHITE: $newPWD $GREEN$ $DEFAULT_COLOR';
else
    echo -e '$PURPLE[\t] $LIGHT_CYAN\u$YELLOW@\h$WHITE: $newPWD $RED$ $DEFAULT_COLOR';
fi; \`"
export PS1;

由于某种原因,获取 newPWD 不起作用。它存在于环境中(我可以使用 echo 打印它),但是它没有添加到命令行提示符中。总是添加一个空字符串。所以一个示例输出是:

[11:54:09] ber@szak:  $

有什么想法为什么不呢?


PS。这是我的解决方案:

BLACK="\[\033[0;30m\]"
DARK_GRAY="\[\033[1;30m\]"
LIGHT_GRAY="\[\033[0;37m\]"
BLUE="\[\033[0;34m\]"
LIGHT_BLUE="\[\033[1;34m\]"
GREEN="\[\033[0;32m\]"
LIGHT_GREEN="\[\033[1;32m\]"
CYAN="\[\033[0;36m\]"
LIGHT_CYAN="\[\033[1;36m\]"
RED="\[\033[0;31m\]"
LIGHT_RED="\[\033[1;31m\]"
PURPLE="\[\033[0;35m\]"
LIGHT_PURPLE="\[\033[1;35m\]"
BROWN="\[\033[0;33m\]"
YELLOW="\[\033[1;33m\]"
WHITE="\[\033[1;37m\]"
DEFAULT_COLOR="\[\033[00m\]"

export MYPATHPS='$(
    echo -n "${PWD/#$HOME/~}" | 
    awk -F "/" '"'"'{
        if (length() > 14) {
            if (NF>4) print  "/"  "/.../" $(NF-1) "/" $NF;
            else if (NF>3) print  "/"  "/.../" $NF;
            else print  "/.../" $NF;
        }
        else print ;
    }'"'"'
)';

PS1="$PURPLE[\t] $LIGHT_CYAN\u$YELLOW@\h \` if [ \$? = 0 ]
    then
        echo -en '$GREEN'
    else
        echo -en '$RED'
    fi;
\` $MYPATHPS $ $DEFAULT_COLOR ";
export PS1;

在此处输入图像描述

4

1 回答 1

2

你需要exportnewPWD。仅仅因为你可以echo它并不意味着它在环境中。这意味着它在外壳和/或环境中的设置。要知道环境中是否有东西,我会使用:

env | grep '^newPWD'

我不确定,但我认为这样使用不会newPWD起作用,因为newPWD每次更改目录时都不会重置PWD。因此,您可能最终需要更改设置以每次PS1调用该函数。prompt_command

从您的评论看来,我的猜测newPWD是正确的。因此,您需要做的就是将prompt_command功能更改为echo您想要的提示。然后将您的PS1设置更改为

PS1="\`if [ \$? = 0 ];
                then
                    echo -e '$PURPLE[\t] $LIGHT_CYAN\u$YELLOW@\h$WHITE: $(prompt_command) $GREEN $DEFAULT_COLOR';
                else
                    echo -e '$PURPLE[\t] $LIGHT_CYAN\u$YELLOW@\h$WHITE: $(prompt_command) $RED $DEFAULT_COLOR';
              fi; \`"
export PS1;

注意:我还删除了尾随$,因为我认为它们是拼写错误。不确定这是否正确$RED$$GREEN$

于 2011-11-14T11:06:04.357 回答