Ответы:
Да, есть два пути. Одним из них является набор PROMPT_COMMAND
в .bashrc
, а другой - к заданной подстановки команд в PS1
для echo $?
команды.
Способ 1:
Со страницы руководства bash:
PROMPT_COMMAND
If set, the value is executed as a command prior to issuing each primary prompt.
Независимо от того, для чего вы установили эту переменную, каждый раз будет выполняться перед выводом приглашения. Демо-версия:
$> PROMPT_COMMAND=" echo 'Last command exited with' \$? 'code' "
Last command exited with 0 code
$> ls /etc/passwd > /dev/null
Last command exited with 0 code
$> ls /etc/asdf > /dev/null
ls: cannot access /etc/asdf: No such file or directory
Last command exited with 2 code
$>
Обратите внимание на использование \$?
. Для постоянного изменения сохраните его в.bashrc
Способ 2
Предположим, что мое PS1
приглашение настроено так:
PS1='
user@ubuntu:$> '
Если я хочу запускать какую-либо программу каждый раз, когда это приглашение перерисовывается на экране (что происходит после каждой предыдущей команды), мне нужно будет использовать command substitution $(. . .)
и установить его в приглашении следующим образом:
PS1=' [ $? ]
user@ubuntu: $> '
Демо-версия:
$> PS1=' [ $? ]
> $>_ '
[ 0 ]
$>_ ls /etc/passwd > /dev/null
[ 0 ]
$>_ ls /etc/asdf > /dev/null
ls: cannot access /etc/asdf: No such file or directory
[ 2 ]
$>_
Обратите внимание, что я разделил свой PS1 на две строки: верхняя [ exitcode ]
и нижняя $> <blank space>'
. Вот почему >
перед $> '
второй строкой >
стоит PS2
знак «перед» («ведущий» - подсказка для многострочных команд). Кроме того, вы можете сделать что-то вроде этого (обратите внимание на $'...'
структуру):
$> PS1=$'[ $? ] \n$> '
[ 0 ]
$>
PS1
это просто текст, который печатается до получения пользовательского ввода - не более того. Он не защищен от расширения параметров и подстановок команд, поэтому вы можете поместить что угодно $(...)
, например, $( pwd )
и это будет показано там. Я использовал это с пользовательским сценарием, чтобы показать заряд батареи ноутбука, например
Метод , который я выбрал из Арх вики это trap
ERR
. trap
используется в Bash для запуска команд при получении сигнала или для некоторых других событий. ERR
Ловушка RAN всякий раз , когда ток завершается командной строки с ошибкой - возвращаемое значение не равно 0. (Если она прекращает нормально, возвращаемое значение, очевидно , будет 0.)
Так, например:
trap 'printf "\ncode %d\n\n" $?' ERR
Затем:
$ echo foo
foo
$ false
code 1
$
(Примечание: после echo
команды, которая была успешно выполнена, нет сообщений. Что это значит, когда я набираю команду, а терминал ничего не делает? )
Подсказка Arch Wiki пошла дальше и раскрасила сообщение, чтобы вы получили заметное желтое сообщение:
EC() { echo -e '\e[1;33m'code $?'\e[m\n'; }
trap EC ERR
Эффект:
По сути, все, что мне нужно сделать, это следить за желтым цветом code
в выводе, чтобы знать, что команда не выполнена.