Переменная $? не работает на $PS1 на mksh

Я хочу, чтобы мое приглашение показывало статус выхода последней команды, поэтому я установил для своего PS1 следующее:

PS1="$? > "

Но он всегда печатает 0 >.
Даже когда я бегуfalse, например, приглашение не печатает 1 > или какой бы там ни был статус выхода.

Почему это происходит?

РЕДАКТИРОВАТЬ:

Я попытался использовать функцию для установки моего приглашения, проверяя, был ли статус выхода больше 0, поэтому он не будет печатать 0 > всегда, только если статус выхода не равен нулю.

 promptcmd() {
    _EXIT=$?
    test $_EXIT -gt 0  && printf "\e[1;31m [$_EXIT]"
    printf "\e[0m ❯ "
    unset _EXIT
 }

 PS1="$(promptcmd)"

Но это тоже не работает.

1 ответ

Решение

$?был расширен, когда вы определили PS1, потому что вы использовали двойные кавычки.

Вы можете использовать одинарные кавычки, чтобы отложить раскрытие до PS1 отображается:

PS1='$? > '

Такое "двойное расширение" не является свойством параметров в целом, а является результатом того, как оболочка использует значение PS1. echo "$PS1" по-прежнему будет показывать буквальную строку $? >, но когда оболочка отображает приглашение, она расширяет любые раскрытия параметров, найденные в значении.

Другие вопросы по тегам