Bashscript 中字符串内的条件

Bashscript 中字符串内的条件

如果失败,我想在 shell 中打印上一个命令的退出代码。所以我像这样改变了PS1变量:/etc/bash.bashrc

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

但它总是打印上一个命令的退出代码。有没有办法在模板中添加条件,这样如果$?等于0,它就不会打印$?

答案1

您可以在内部创建条件和表达式,$()如下所示:

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] $ 

答案2

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'

相关内容