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


9

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

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

Ответы:


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в выводе, чтобы знать, что команда не выполнена.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.