如果返回错误,则在 Bash 提示中显示最后一个命令的退出代码

Mic*_*eon 11 shell bash prompt

我已将最后一个命令的返回值添加到PS1我的.bashrc.

现在我只想在值不为零时才显示它。

Android 的外壳有它:

${| local e=$? (( e )) && REPLY+="$e|" return $e }
Run Code Online (Sandbox Code Playgroud)

问题:如何将其转换为 bash?

Qua*_*odo 15

PS1='${?#0}$ '
Run Code Online (Sandbox Code Playgroud)

它使用了一种特殊形式的参数扩展, ${?#0},这意味着:“如果它是${?}前一个命令的退出代码的第一个字符,则删除字符零。”

如果最后一个退出代码不为零,您还可以更改提示的颜色:

PS1='\[\e[0;$(($?==0?0:91))m\]$ \[\e[0m\]'
Run Code Online (Sandbox Code Playgroud)

迅速的

如果最后一个命令以非零退出,则使用if-else 三元表达式 $(($?==0?0:91))生成颜色代码0;91m(红色,请参阅颜色代码),否则0;0m(您的默认颜色)。

  • 我最喜欢 bash 的一点是它的可读性和明显性…… (9认同)
  • @AdamBarnes 这里丑陋的部分都与(虚拟)终端有关,以及如何让它们做其他事情而不是在背景色背景上显示纯前景色文本。所有的编程语言都面临着同样的问题——除非他们把那部分抽象到一些库 API 后面,比如 termcap 或 curses。如果您愿意,您当然可以在 Bash 中找到或编写一个。 (2认同)

iBu*_*Bug 8

这是在我的.bashrc

PS1_PROMPT() {
  local e=$?
  (( e )) && printf "$e|"
  return $e
}
PS1='$(PS1_PROMPT)'"$PS1"
Run Code Online (Sandbox Code Playgroud)
ibug@example:~ $ false
1|ibug@example:~ $ ^C
130|ibug@exame:~ $ true
ibug@example:~ $
Run Code Online (Sandbox Code Playgroud)

与 JoL 的答案相比,这具有优势,即 的值$?在显示后保留(通过return $e)。它也基本上是对 Android 的默认设置的返工,/system/etc/mkshrc可以完成相同的工作。

请注意,$(PS1_PROMPT)被括在单引号,因为$PS1被评估每它的印刷时间中,除了当集的变量赋值表达式,所以单引号防止它被evaluted到现在打印时,相反该推迟到。

或者,根据 ilkkachu 的建议,您可以使用 BashPROMPT_COMMAND特殊变量:

PS1_PROMPT() {
  local e=$?
  PROMPT_ECODE=
  (( e )) && PROMPT_ECODE="$e|"
  return $e
}
PROMPT_COMMAND=PS1_PROMPT
PS1='$PROMPT_ECODE'"$PS1"
Run Code Online (Sandbox Code Playgroud)

这有一个优点,即每次打印 PS1 时都不会产生子外壳。


JoL*_*JoL 4

整个AndroidPS1是:

${|
    local e=$?

    (( e )) && REPLY+="$e|"

    return $e
}$HOSTNAME:${PWD:-?} $ 
Run Code Online (Sandbox Code Playgroud)

我不认识${|,但这个 bash 是等效的:

PS1='$(e=$?; (( e )) && echo "$e|")$HOSTNAME:${PWD:-?} $ '
Run Code Online (Sandbox Code Playgroud)

local不需要,因为它$()是一个子 shell。

  • 仅供参考:`${| cmds }` 是 MirBSD Korn Shell (mksh) 特定的 ([ref](/q/611057))。 (2认同)