问题描述
我想要一个标准的 BASH PS1 提示,它会根据服务器的主机名自动设置颜色。
这意味着每当登录服务器时,您会立即清楚和熟悉您在该服务器上,因为提示颜色与其他服务器不同
给定的主机名必须始终具有相同的颜色
我在十六进制代码中发现了类似的想法,但这是专门用于 BASH 颜色的
我们的想法是可以有一个标准的 bash 提示代码片段,可以包含在任何地方,并且总是为不同的服务器提供不同的颜色,而无需任何进一步的代码更改
简而言之,问题是您可以编写什么 bash 函数来接受 2 个参数 - 一个字符串和一个散列。它应该以散列确定的颜色回显字符串,并且对于任何给定的散列,颜色应该始终相同
编辑 - 澄清
到目前为止的答案假设主机名是预先知道的
我正在寻找可以根据该服务器的任何主机名确定性地分配相同随机颜色的东西
在新服务器上安装 PS1 时,我绝对不会寻找需要任何类型代码更改的东西
这篇文章大致如此,但似乎没有我可以使用的简单 PS1 片段https://aweirdimagination.net/2015/02/28/better-hash-based-colors/
解决方法
确定主机名是什么,然后定义PS1
。
case $HOSTNAME in
foo.com) color='...' ;;
bar.org) color='...' ;;
esac
PS1="..." # using $color as necessary
,
declare -A color=([hosty]=33 [hostr]=31 [hostb]=34 [hostm]=35)
function color () {
host=$1
printf $'\e[%d;1m%s\e[m' "${color[$host]}" "$host"
}
PS1='$(color $HOSTNAME)$ '
,
我正在寻找可以根据该服务器的任何主机名确定性地分配相同随机颜色的东西
采用散列算法并计算主机名的散列 - 将字符串转换为数字。然后使用这个伪随机数生成颜色。
gen_prompt_function() {
local number
number=$(
# get "random" string that depends on hostname
md5sum <<<"$HOSTNAME" |
# meh - take first byte and convert it to decimal
cut -c-2 | xargs -i printf "%d\n" "0x{}" |
# convert 0-255 range into 30-37 range
awk '{print int($0/255.0*(37-30)+30)}'
)
printf '\[\e[%d;1m\]%s\[\e[m\]' "$number" "$HOSTNAME"
}
PS1="$(gen_prompt_function)"'$ '
阅读ANSI escpe sequences、tput 以及关于color handling in terminfo 和bash manual controlling prompt。请记住在颜色代码周围添加 \[
\]
。
附注。在我专门为主机名提示着色的 bash 冒险中,我编写了一个 color handling script,它从 3 种 RGB 颜色生成彩虹,这些颜色取自从字符串的哈希中提取的前 18 个字符,如下面的 screeshot 所示。该脚本用于我的 PS1 configuration。