Відповіді:
Так, є два способи. Одним з них є набір 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 )і це буде показано там. Я використовував це зі спеціальним сценарієм, щоб показати потужність акумулятора ноутбука, наприклад
Метод, який я вибрав з Arch Wiki - це 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на виході, щоб знати, що команда не вдалася.