Вывести возвращаемое значение после выполнения программы

9

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

Это то, что можно настроить? Codeblocks имеет эту функцию.

mr.backy
источник

Ответы:

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 Это действительно работает. Я не сомневаюсь ни в ком с репутацией 27k, но, очевидно, приглашение не является «командой», так что использование $? в это не попадает $? сбросить на ноль, как я и думал - даже используя первый метод, который выполняет эхо без ошибок.
Джо
PS1это просто текст, который печатается до получения пользовательского ввода - не более того. Он не защищен от расширения параметров и подстановок команд, поэтому вы можете поместить что угодно $(...), например, $( pwd )и это будет показано там. Я использовал это с пользовательским сценарием, чтобы показать заряд батареи ноутбука, например
Сергей Колодяжный
@mchid что ты имеешь ввиду?
Сергей Колодяжный
1
@mchid "До выдачи каждой первичной подсказки", следовательно, после завершения выполнения последней команды.
Кос
1
@mchid запускается до того, как выводится приглашение, поэтому прежде чем вы наберете следующую команду.
Муру
4

Метод , который я выбрал из Арх вики это 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в выводе, чтобы знать, что команда не выполнена.

Мур
источник