Состояние внутри строки в Bashscript

Я хочу напечатать код выхода предыдущей команды в оболочке, если она не удалась. Поэтому я изменил переменную PS1 в /etc/bash.bashrc следующим образом:

 PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w [$?] \$ ' #_______________________________________________^^^^_____ 

но он всегда печатает код выхода предыдущей команды. Есть ли способ добавить условие в шаблон, поэтому, если $? равна 0 , он не печатает $?

Вы можете создавать условия и выражения внутри $() следующим образом:

 echo "$( var=2; echo $var)" 

в вашем примере вы можете изменить переменную PS1 следующим образом:

 PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w $( status=$?; (( status != 0 )) && echo "[$status] " )\$ ' 

выглядит как:

 jackman@b7q9bw1:~ $ echo hello hello jackman@b7q9bw1:~ $ sh -c 'exit 42' jackman@b7q9bw1:~ [42] $ 

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

 PROMPT_COMMAND_set_status () { if ((last_status == 0)); then PS1_status= else PS1_status="[$last_status] " fi } PS1=PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w $PS1_status\$ ' PROMPT_COMMAND='last_status=$?; PROMPT_COMMAND_set_status'