Каждая команда, которую я набираю в bash, возвращает с кодом выхода.
Я хочу: всякий раз, когда я набираю команду в приглашении bash, я хочу, чтобы она завершила выход и распечатала состояние выхода, то есть echo $?. [ ! d1]
например если я запускаю echo "hello"; в приглашении bash, вывод должен быть:
linux@linux$ hello
linux@linux$ 0
Еще один способ, который я выбрал из Arch Wiki, - использовать trap:
EC() { echo -e '\e[1;33m'code $?'\e[m\n'; }
trap EC ERR
Эффект:
$ ( exit 1 )
code 1
$ some-non-existent-command
some-non-existent-command: command not found
code 127
$
Вот простой пример:
PS1='$? > '
Если вы используете двойные кавычки, вам нужно добавить обратную косую черту, чтобы выйти из $:
PS1="\$? > "
Выход:
0 > echo 'ok'
ok
0 > bogus
bogus: command not found
127 >
Еще лучший способ - напечатать только код выхода, если он не равен нулю.
PS1='${?#0}> ' # single quote example
PS1="\${?#0}> " # double quote example (requires extra backslash)
Пример вывода:
> echo 'ok'
ok
> bogus
bogus: command not found
127>
Объяснение: ${var#pattern} - это расширение параметра bash, которое означает удаление кратчайшего совпадающего шаблона с лицевой стороны $ var. Таким образом, в этом случае мы удаляем 0 с фронта $?, что эффективно сокращает код выхода из 0.
Если использовать двойные кавычки, $? будет заменен, когда PS1 устанавливается, а не оценивается каждый раз. Сделайте echo $PS1, чтобы подтвердить, что у вас нет жестко заданного значения в PS1.