Друкувати повернене значення після виконання програми


9

Мені цікаво, як встановити опцію для автоматичного друку повернення значення після кожного виконання програми в терміналі без набору тексту echo $?.

Це щось, що можна налаштувати? Кодблоки мають таку особливість.

Відповіді:


10

Так, є два способи. Одним з них є набір 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 ] 
$> 

+1 Це насправді працює. Я не сумніваюся ні в кого з репутацією 27 тис., Але, мабуть, підказка не є "командою", тому використовуючи $? в цьому не отримує $? скинути до нуля, як я думав, що це може бути - навіть використовуючи перший метод, який виконує ехо без помилок.
Джо

PS1це лише текст, який друкується до отримання вводу користувача - не більше того. Він не застрахований від розширення параметрів і підстановок команд, тому ви можете ввести що завгодно $(...), наприклад, $( pwd )і це буде показано там. Я використовував це зі спеціальним сценарієм, щоб показати потужність акумулятора ноутбука, наприклад
Сергій Колодяжний

@mchid, що ти маєш на увазі?
Сергій Колодяжний

1
@mchid "До видачі кожного первинного підказки", відтак після завершення виконання останньої команди.
kos

1
@mchid запускається до друку запиту - тому перед тим, як ввести наступну команду.
муру

4

Метод, який я вибрав з 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на виході, щоб знати, що команда не вдалася.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.