Включите коды выхода, отличные от 0, в следующем приглашении bash - PullRequest
16 голосов
/ 10 мая 2011

Иногда я запускаю команду с большим количеством вывода.Иногда последние 30-40 строк этого вывода (то есть единственная часть вывода, которую я когда-либо действительно вижу) в порядке, но намного дальше, была ошибка.Я бы хотел, чтобы было легче заметить, что команда не выполнена.Для этого я хочу, чтобы код возврата был частью моей подсказки.Поэтому я взял свой $ PS1:

[\D{%Y-%m-%d} \t] \[\e]0;\u@\h: \w\a\]\$

... и расширил его до следующего значения:

[\D{%Y-%m-%d} \t] ${?/^0$/} \[\e]0;\u@\h: \w\a\]\$

В результате выдается следующее приглашение:

[2011-05-10 09:38:07] 0 soren@lenny:~$ 

Тем не менее, я хотел бы найти способ, чтобы он включал только код выхода, если он не был равен 0.Как я могу это сделать?Конечно, я мог бы использовать

$(echo \$? | sed -e blah)

, но, несмотря на то, что он такой же легкий, как и sed, он все же немного тяжелее, чем встроенные в bash вещи.

Ответы [ 9 ]

12 голосов
/ 10 мая 2011

Немного о printf злоупотреблении:

printf '%.*s' $? $?
8 голосов
/ 25 июля 2011

У меня работает следующее:

PS1="[\D{%Y-%m-%d} \t] \u@\h:\w\a \${?##0} \$ "

пример когда $?0:

[2011-07-25 11:56:57] plars@plars-t500:~  $<br>
there is an extra space there ---------^^ not sure if that's a problem for you

пример, когда $?130:

[2011-07-25 11:57:39] plars@plars-t500:~ 130 $
6 голосов
/ 10 мая 2011

Вы можете использовать встроенное сопоставление с образцом bash:

$ rc=0
$ echo ${rc##0}

$ rc=123
$ echo ${rc##0}
123
4 голосов
/ 10 мая 2011

Вы можете поместить оператор if внутри вашего PS1, который отображает статус выхода, только если он ненулевой:

PS1='[\D{%Y-%m-%d} \t] $(es=$?; if [ $es -ne 0 ]; then echo $es; fi) \[\e]0;\u@\h: \w\a\]\$'
4 голосов
/ 10 мая 2011

Вот что я использую в моем .bashrc , чтобы получить красное число с кодом выхода.Подробный, но он выполняет свою работу и должен быть переносимым.

highlight()
{
    if [ -x /usr/bin/tput ]
    then
        tput bold
        tput setaf $1
    fi
    shift
    printf -- "$@"
    if [ -x /usr/bin/tput ]
    then
        tput sgr0
    fi
}

highlight_error()
{
    highlight 1 "$@"
}

highlight_exit_code()
{
    exit_code=$?
    if [ $exit_code -ne 0 ]
    then
        highlight_error "$exit_code "
    fi
}

PS1='$(highlight_exit_code)...'
3 голосов
/ 25 июля 2011

Обычный способ сделать это - использовать trap ... ERR для выполнения произвольного кода при сбое команды:

 $ trap 'echo $?' ERR
 $ true
 $ false
1
 $

Классическая шутка UNIX - trap 'echo You have new mail.' ERR

1 голос
/ 24 июля 2014

Это приглашение, которое я использую, вставьте в .bashrc и используйте его для его использования.Как вы можете видеть, PREV_RET_VAL добавляется к PS1 только в том случае, если значение не равно 0.

COLOR_RED_BOLD="\[\e[31;1m\]"
COLOR_GREEN_BOLD="\[\e[32;1m\]"
COLOR_NONE="\[\e[0m\]"

# prompt function
promptFunc()
{
PREV_RET_VAL=$?;

PS1=""

PS1="${PS1}\e[1;30m[\e[1;34m\u@\H\e[1;30m:\e[0;37m \e[0;32m\d \T\e[1;30m]\e[1;37m \w\e[0;37m\[\033]0; \w - \u@\H \007\]\n\[\] "

if test $PREV_RET_VAL -eq 0
then
    PS1="${PS1}${COLOR_GREEN_BOLD}\\$ ${COLOR_NONE}"
else
    PS1="${PS1}${COLOR_RED_BOLD}\\$ [${PREV_RET_VAL}] ${COLOR_NONE}"
fi
}

PROMPT_COMMAND=promptFunc
1 голос
/ 16 октября 2013

Для пользователей zsh: вставьте это в ваш PROMPT: %(?,, -%?-)

0 голосов
/ 10 марта 2017

Пример одинарной кавычки:

PS1='${?#0}> '

Пример двойной кавычки (обратите внимание на дополнительную обратную косую черту, чтобы избежать $)

PS1="\${?#0}> "

Пример вывода:

> echo 'ok'
ok
> bogus
bogus: command not found
127> 

Объяснение: ${var#pattern} - это расширение параметра bash, которое означает удаление кратчайшего подходящего шаблона из передней части $ var. Таким образом, в этом случае мы удаляем 0 с начала $?, что фактически усекает код выхода 0.

Если используются двойные кавычки, $? будет подставлено, когда установлено PS1, вместо того, чтобы оцениваться каждый раз. Сделайте echo $PS1, чтобы подтвердить, что у вас нет жестко заданного значения в PS1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...