Показать код выхода последней команды в приглашении Bash, если она вернула ошибку

Встроенная функцияgetoptsможет обрабатывать только односимвольные опции -; вы должны использовать что-то вроде

getopts 's:e:h'

Я также опустил двоеточие после h, так как вам, вероятно, не нужен аргумент для -h.

11
10.06.2021, 00:36
4 ответа

Весь Android PS1— это:

${|
    local e=$?

    (( e )) && REPLY+="$e|"

    return $e
}$HOSTNAME:${PWD:-?} $ 

Не узнаю ${|, но этот баш эквивалентен:

PS1='$(e=$?; (( e )) && echo "$e|")$HOSTNAME:${PWD:-?} $ '

localне требуется, потому что $()является подоболочкой.

4
28.07.2021, 11:26
PS1='${?#0}$ '

Используется специальная форма расширения параметров , ${?#0}, что означает :«Удалить символ ноль, если он является первым символом ${?}, код выхода предыдущей команды."

Вы также можете изменить цвет подсказки, если последний код выхода не равен нулю:

PS1='\[\e[0;$(($?==0?0:91))m\]$ \[\e[0m\]'

Prompt

Это использует if -else троичное выражение $(($?==0?0:91)), которое делает цветовой код0;91m(красным, см. цветовые коды ), если последняя команда завершается с не -нулем, или0;0m(ваш цвет по умолчанию )иначе.

15
28.07.2021, 11:26

Это то, что я использую в своем.bashrc:

PS1_PROMPT() {
  local e=$?
  (( e )) && printf "$e|"
  return $e
}
PS1='$(PS1_PROMPT)'"$PS1"
ibug@example:~ $ false
1|ibug@example:~ $ ^C
130|ibug@exame:~ $ true
ibug@example:~ $

Это имеет то преимущество перед ответом JoL, что значение $?сохраняется после отображения (черезreturn $e). Это также в основном переработка Android по умолчанию /system/etc/mkshrc, которая выполняет ту же работу.

Обратите внимание, что $(PS1_PROMPT)заключен в одинарные кавычки, потому что $PS1оценивается каждый раз, когда оно печатается, в дополнение к тому, когда оно установлено в выражении присваивания переменной, поэтому одинарные кавычки предотвращают его вычисление прямо сейчас и вместо этого откладывает это при печати.

В качестве альтернативы, как предложил ilkkachu, вы можете использовать специальную переменную Bash PROMPT_COMMAND:

PS1_PROMPT() {
  local e=$?
  PROMPT_ECODE=
  (( e )) && PROMPT_ECODE="$e|"
  return $e
}
PROMPT_COMMAND=PS1_PROMPT
PS1='$PROMPT_ECODE'"$PS1"

У этого есть одно преимущество, заключающееся в том, что подоболочка не создается каждый раз, когда печатается PS1.

8
28.07.2021, 11:26

Всем спасибо, на этом я и согласился:

PS1_PROMPT() {
  local e=$?
  #(( e )) && printf "$e|" # BW
  (( e )) && printf "\033[01;31m$e\033[00m|"  # color
  return $e
}
PS1='$(PS1_PROMPT)'"$PS1"

Отображает errno, также известный как $?, красным цветом, если он отличается от 0.

Обратите внимание, что условие, найденное в.bashrc, "$color_prompt" = yesнельзя было использовать выше, потому что функция PS1 _PROMPT ()оценивается не в.bashrc, а каждый раз в приглашении. Я не хотел экспортировать $color_promptпо всей системе.

0
28.07.2021, 11:26

Теги

Похожие вопросы