如何在 OpenBSD 下获得绿色/红色终端?

如何在 OpenBSD 下获得绿色/红色终端?

对于linux机器我可以使用:

# vi ~/.bashrc # red/green terminal colors regarding exit code

export PROMPT_COMMAND='PS1="`
if [[ \$? = "0" ]];
then echo "\\[\\033[0;32m\\]";
else echo "\\[\\033[0;31m\\]";
fi`[\u@\h \w]\[\e[m\] "'
export PS1

当退出代码为0时获得绿色终端,当退出代码不为0时获得红色提示。

我怎样才能在 OpenBSD 下做到这一点? (默认ksh)

(我试图这样做,但没有成功 - 使用 ssh 从我的笔记本连接到 OpenBSD 机器 - ubuntu/gnome-terminal。)

答案1

每个 shell 都有自己的扩展提示符的方式。 OpenBSD 的 ksh 是 pdksh。查看其提示设置手动的,在PS1参数下。

ksh 的工作方式是在打印提示符之前对$的值执行参数替换、命令替换和算术替换(所有扩展) 。PS1所以你设置PS1一劳永逸,但每次都会重新生成该值。 (如果你输入shopt -s promptvars你的,你也可以在 bash 中做到这一点.bashrc。)

OpenBSD 的 ksh 支持类似于 bash 的反斜杠转义。对于其他版本的 ksh,您还需要将 bash 提示符转义序列转换为$替换序列。

PS1='$(if (($? == 0)); then print -n "\\033[32m"; else print -n "\\033[31m"; fi)'
PS1="$PS1"'[\u@\h \w]'$(print '\033')'[0m '

上面的简单翻译有一些缺陷:

  • 它每次都会fork一个进程来分析$?。有一种方法可以避免这种情况,但在 ksh88 中它很糟糕。
  • 由于零宽度控制序列,它会导致重绘错误。通过手册中记录的严重黑客行为可以避免这种情况。

下面是一些更复杂的代码,它们使用算术来避免生成子 shell,并负责分隔不可打印的序列。

escape=$(print '\033')
ctrla=$(print '\001')
PS1=$(print '\001\015')
PS1=$PS1$ctrla$escape'[$(($? ? 31 : 32))m'$ctrla
PS1=$PS1'[\u@\h \w]'
PS1=$PS1$ctrla$escape'[0m'$ctrla' '

答案2

问题是bash只有PROMPT_COMMAND.试试这个:

PS1='\[$(if (($?)); then tput setaf 1; else tput setaf 2; fi)\]'\
'[\u@\h \w]\['"$(tput sgr0)"'\]'

¹ 警告:我还没有在 上测试过这一点ksh,但它可以避免PROMPT_COMMAND并在bash.

²tput使用您系统的terminfo数据库。如果 terminfo 安装正确,这通常比硬编码转义序列更可移植和可维护。

相关内容