Я читал этот https://wiki.archlinux.org/index.php/Color_Bash_Prompt и получил следующее:

# Stores the status of each command in $RET
PROMPT_COMMAND='RET=$?;'

# A colour.
RED_SHELL='\e[0;36m'

# Prints "Status 1" if RET is 1, for example.
RET_VISUALISE='$(if [[ $RET != 0 ]]; then echo -ne "Status \[$RED_SHELL\]$RET\n" && RET=0; fi;)'

# What to print for each prompt.
PS1="$RET_VISUALISE\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \t \[\e[33m\]\w\[\e[0m\]\n\$ "

Это делает почти то, что я хочу, кроме случаев, когда я нажимаю Enter, Enter, Enter несколько раз после команды, которая вернула статус!= 0 В этом случае он печатает "Status 1" каждый раз, когда я нажимаю Enter.

Это то, что && RET=0; часть должна была избавиться.

Кроме того, я не понимаю, почему env | grep RET показывает только содержимое PS1 . Какова область действия $RET ?

1 ответ1

0

Вы переопределяете свой RET=0 с помощью RET=$? когда следующая подсказка печатается без выполнения команды между ними. $? возвращает возвращаемое значение последней выполненной команды, и это все еще 1 .

Bash позволяет вам отлавливать ошибки в выполненных командах и выполнять код в ответ на это (один раз):

function err_handle {
    RET=$?
    if [[ $RET != 0 ]]; then
        echo -ne "Status $RED_SHELL$RET\n"
    fi
}
trap 'err_handle' ERR

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .