Весь Android PS1
— это:
${|
local e=$?
(( e )) && REPLY+="$e|"
return $e
}$HOSTNAME:${PWD:-?} $
Не узнаю ${|
, но этот баш эквивалентен:
PS1='$(e=$?; (( e )) && echo "$e|")$HOSTNAME:${PWD:-?} $ '
local
не требуется, потому что $()
является подоболочкой.
PS1='${?#0}$ '
Используется специальная форма расширения параметров , ${?#0}
, что означает :«Удалить символ ноль, если он является первым символом ${?}
, код выхода предыдущей команды."
Вы также можете изменить цвет подсказки, если последний код выхода не равен нулю:
PS1='\[\e[0;$(($?==0?0:91))m\]$ \[\e[0m\]'
Это использует if -else троичное выражение $(($?==0?0:91))
, которое делает цветовой код0;91m
(красным, см. цветовые коды ), если последняя команда завершается с не -нулем, или0;0m
(ваш цвет по умолчанию )иначе.
Это то, что я использую в своем.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.
Всем спасибо, на этом я и согласился:
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
по всей системе.