【问题标题】:Save bash exit code保存 bash 退出代码
【发布时间】:2014-02-26 13:14:42
【问题描述】:

我正在尝试创建一个色彩丰富且内容丰富的 bash 提示符,但我不知道如何保存 $? if 测试后的退出代码供以后使用(这似乎改变了 $?)。 正在做:

exit_code=$?
PS1="\$(if (( \$? == 0 )); then echo \"$GREEN\"; else echo \"$RED\"; fi)$exit_code $NORMAL\u@\h $BLUE\W`if (( $UID == 0 )); then echo \"$RED#\" else echo \"$GREEN$\"; fi`$NORMAL "

似乎也不起作用。两个美元?测试后exit_code为0。

我确信这在 bash 中是可能的,但是如何实现呢?

到目前为止,这是我的 PS1:

PS1="\$(if (( \$? == 0 )); then echo \"$GREEN\"; else echo \"$RED\"; fi)$?$NORMAL\u@\h $BLUE\W`if (( $UID == 0 )); then echo \"$RED#\" else echo \"$GREEN$\"; fi`$NORMAL "

还有 $?即使颜色根据退出代码在红色和绿色之间变化,也只是零,这就是让我觉得是 if 测试将其设置为零的原因。

我知道如果分成多行会更容易阅读,但我更喜欢将其保留为单行。

如果您发现任何其他错误,也请告诉我,因为我只是在这里和那里看看什么有效,因为我对需要在哪里放置反斜杠以及在哪里不需要放置反斜杠感到很困惑。

GREEN、BLUE、RED 和 NORMAL 只是上面定义的颜色,目的是让事情变得不那么神秘。

【问题讨论】:

  • 请记住,(( ... )) 是与任何其他命令一样的命令,而不是语法,因此设置了 $? 的值。但是,它的写入方式(如果$? 为零则成功,否则失败)只会在它已经为零时将其设置为零,并且在它非零时设置为1,因此不会真正解释你所看到的。此外,这些都不会对exit_code 产生任何影响。您确定没有在exit_code=$? 之前运行任何其他会重置$? 的命令吗?

标签: bash prompt exit-code


【解决方案1】:

我以这种方式构建提示:

user_host_path="${debian_chroot:+($debian_chroot) }"'\u@\h: \w'
xterm_title='\[\e]0;'"$user_host_path"'\a\]'
[[ $TERM == xterm* || $TERM == rxvt* ]] && line1="${xterm_title}"
git_branch='$(git_current_branch)'
line1="${line1}${user_host_path}${git_branch}"
line2='\! \$ '
print_time='printf "%*s" $((COLUMNS - 9)) " "|sed "s/./˙/g"; date "+ %T"'
color_bold='\[\033[0;1m\]'
color_reset='\[\033[0m\]'
PROMPT_COMMAND="_rc_=\$?;${print_time};((_rc_!=0)) && PS1='${line1}\n${color_bold}[\$_rc_]${color_reset} ${line2}' || PS1='${line1}\n${line2}'"

所以,关键是将$?保存在提示变量中。

【讨论】:

  • 是的,但问题是我需要使用 $?在似乎干扰其值的 if 测试之后。
  • 我在最后一行做了同样的事情。在进行测试之前保存它。
  • 啊,我明白了。我看到你做了什么,但不能从中得到任何有用的东西。我试过 PROMPT_COMMAND="rc_=$?;((_rc!=0)) && PS1='$RED$_rc_' || PS1='$GREEN$_rc_'" 但它没有显示数字,它只会使文本变为红色或绿色。
  • 您评论中的代码格式不正确。你做了_rc_=\$? - 必须保护双引号字符串中的变量。
  • PROMPT_COMMAND="rc_=\$?;((_rc!=0)) && PS1=\"$RED$_rc_\" || PS1=\"$绿色$_rc_\""。一样。没有号码。另外我只是在提示符下进行了检查,我很确定什么时候 $?变化,rc 也会变化。也许我的系统配置不正确?编辑:它似乎删除了一些_,但它在我的 bashrc 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 2018-09-05
  • 2016-08-16
  • 1970-01-01
  • 2023-01-26
  • 1970-01-01
  • 2017-01-08
相关资源
最近更新 更多