статус выхода bash всегда 0

Я столкнулся с этой странной проблемой, когда мой статус выхода всегда возвращает 0, даже если он не выполнился успешно.

Я хочу вывести статус выхода в моем приглашении со следующим кодом:

function status() {
    echo $?
}

export PS1="\$(status)>"

Когда я запускаю это, я получаю следующий вывод

 0❯ pwd
/Users/tringuyen
 0❯ ad
bash: ad: command not found
 0❯ echo $?
127

ясно, что предпоследняя команда ad не вернула код состояния 0. Однако это то, что я получил из подсказки.

Кто-нибудь знает, что здесь может происходить?

РЕДАКТИРОВАТЬ 20 6/11 11:57: Проблема, похоже, в том, что $? всегда равно 0, несмотря ни на что, за исключением того, что в самом файле .bashrc была ошибка, из-за которой он возвращает значение, отличное от 0.


person Tri Nguyen    schedule 20.06.2013    source источник
comment
$(status) запускает команду в подоболочке — дочернем процессе. Пройти $? в качестве параметра: $(status $?), а затем: echo $1 в вашей функции состояния.   -  person jim mcnamara    schedule 20.06.2013
comment
Код, как написано, работает нормально для меня. Мой $BASH_VERSION это 4.2.20(1)-release.   -  person IMSoP    schedule 20.06.2013
comment
У меня нормально работает, этого достаточно PS1="\$?>"   -  person Grzegorz Żur    schedule 20.06.2013
comment
Ради интереса мое определение подсказки читается (частично) export PS1='$(RET=$?; if [ $RET == 0 ]; then echo "\[\033[1;30m\]$RET"; else echo "\[\033[0;31m\]$RET"; fi;) \[\033[1;32m\]\u@\h', что показывает последний статус возврата красным, если он был ненулевым, или серым для нуля. (Захват в $RET позволяет избежать перезаписи другой логикой $? до того, как мы его повторим.)   -  person IMSoP    schedule 20.06.2013
comment
@Grzegorz да, этого достаточно, я поместил это в функцию, потому что хотел делать с ней более сложные вещи, то есть добавлять цвета.   -  person Tri Nguyen    schedule 20.06.2013
comment
@IMSoP Я только что пытался сделать то же самое на своей машине. Я все еще сталкиваюсь с той же проблемой, что описана в моем посте. Есть предположения?   -  person Tri Nguyen    schedule 20.06.2013
comment
@IMSoP мой $BASH_VERSION это 3.2.48(1)-release. Я использую последнюю версию OS X Mountain Lion.   -  person Tri Nguyen    schedule 20.06.2013
comment
@jimmcnamara спасибо. Я пробовал это, не работает, все та же проблема.   -  person Tri Nguyen    schedule 20.06.2013
comment
Хм, дело не только в версии - я получаю такие же (успешные) результаты на 3.2.33(1)-release. Это обе коробки Gentoo Linux, так что возможно что-то другое. Другая возможность заключается в том, что у вас есть другой специальный набор переменных (возможно, $PS2 или $PROMPT_COMMAND?), который каким-то образом перезаписывает $?.   -  person IMSoP    schedule 20.06.2013
comment
@IMSoP У меня действительно есть $PS2set. Это причина почему? Есть ли способ исправить это, не удаляя $PS2?   -  person Tri Nguyen    schedule 20.06.2013
comment
@TriNguyen Исправит ли это гашение? Если это так, опубликуйте свою PS2, и, возможно, мы сможем придумать способ обойти это. См. также ответы на stackoverflow.com/questions/7135824/   -  person IMSoP    schedule 20.06.2013
comment
@IMSoP Я попытался очистить его сейчас, но это не помогло. Я пытался следовать ответам по ссылке, которую вы разместили, и это тоже не сработало...   -  person Tri Nguyen    schedule 20.06.2013
comment
В своем редактировании вы написали: Кажется, проблема в том, что $? всегда 0 несмотря ни на что - это явно не так, как мы видим из вашего примера echo $? output 127; скорее кажется, что PS1 не содержит $? - вы могли бы echo $PS1 проверить.   -  person Armali    schedule 13.09.2013
comment
@TriNguyen Я тоже видел похожую проблему. Я использую Mac OS X 10.11. Когда я делаю то же самое для Linux, это работает. Я предполагаю, что проблема внутри файла .profile или .bash_rc.   -  person solti    schedule 21.11.2015


Ответы (3)


Работает ли следующее для вас с вашей версией bash?

export PS1="\$?>"
person Moreaki    schedule 11.07.2013

В $PS1 я использую следующее:

 PS1="\`if [ \$? = 0 ]; then echo \[\e[33m\]^_^\[\e[0m\]; else echo \[\e[31m\]\$? O_O\[\e[0m\]; fi\`"

Источник: https://github.com/sanmiguel/dotfiles/blob/master/bash/bash_functions.symlink#L63

person sanmiguel    schedule 13.09.2013

У меня тоже была похожая проблема, но моя функция выглядела иначе. Проблема была в том, что я пропустил точку с запятой ";" после VAR=$?

СТАРЫЙ:

function status() {
   VAR=$?
   echo $VAR
}

Всегда возвращал Зеро несмотря ни на что.

НОВЫЙ:

function status() {
   VAR=$?;
   echo VAR;
}

Теперь возвращено правильное возвращаемое значение.

export PS1="\$(status)>"
person solti    schedule 22.11.2015