Настройка профиля Bash не работает для пути - PS1 - PullRequest
2 голосов
/ 14 ноября 2011

Я написал следующий файл настроек профиля 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 не работает.Он присутствует в среде (я могу напечатать его с помощью эха), однако он не добавляется в командную строку.Там пустая строка добавляется всегда.Таким образом, пример выходных данных:

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

Есть идеи, почему бы и нет?Вот мое решение:

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;

enter image description here

1 Ответ

2 голосов
/ 14 ноября 2011

Вам нужно export newPWD. То, что вы можете 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$, так как предположил, что это опечатки. Не уверен, что это правильно

...