我喜欢通过为每个主机设置特定的颜色来确保我登录到了正确的主机。我将我的文件复制.bashrc
到不同的主机,然后为每个主机编辑不同的颜色。
但是,我不想手动编辑每个主机上的颜色,而是自动填充每个主机上 bash 提示符的颜色,每个主机名都有一个独特的颜色。
我正在想象一个命令,.bashrc
它获取主机名,将其转换为独特的颜色,并将其设置为 bash 提示颜色。
问题:如何在 Bash 中将主机名哈希转换为颜色?
它甚至可能根据终端背景颜色判断一组合理的颜色。
答案1
这可能不会根据背景获得“漂亮”的颜色,但它应该可以工作,假设默认背景颜色始终是颜色0
:
tput setaf $(hostname | sum | awk -v ncolors=$(infocmp -1 | expand | sed -n -e "s/^ *colors#\([0-9][0-9]*\),.*/\1/p") 'ncolors>1 {print 1 + ($1 % (ncolors - 1))}')
具体来说:
tput
- 输出终端控制字符串setaf
- 终端控制字符串;在本例中,set ANSI foreground
$(...)
- BASH 可嵌套命令替换颜色参数hostname
- 获取主机名sum
- 计算主机名的简单校验和awk
...-v ncolors=$(...)
- 将 AWK 变量设置ncolors
为命令替换的值$(...)
infocmp -1
- 显示当前终端类型的终端信息,每行一个参数expand
- 将制表符扩展为空格,使sed
脚本更容易理解sed -n -e "s/^ *colors#\([0-9][0-9]*\),.*/\1/p"
colors
- 提取整数终端能力的值
'ncolors>1 {...}'
{...}
- awk 脚本,仅当ncolors
大于 1 时才 运行代码print 1 + ($1 % (ncolors - 1))
- 取绝对值$1
(输入的第 1 个字段,来自sum
,即$1
是校验和值),除以 后求余数(ncolors - 1)
(这会将其限制在到 的范围内0
)(ncolors - 2)
,然后添加1
并打印它。
答案2
您可能对此感兴趣context-color
,这是我根据 J Earls 的回答整理出来的:https://github.com/ramnes/context-color
这是一个简单的脚本,执行时会根据命令输出的哈希输出颜色。将它安装在您的 某个位置后$PATH
,您可以在 中执行如下操作.bashrc
:
export PS1="$(context-color -p)$PS1\[\e[0m\]"
(哪里--prompt/-p
是开关,以便为提示转义颜色,以及\[\e[0m\]
用于重置颜色的转义序列)
默认情况下,用于生成哈希的命令是whoami; hostname
。如果您只是希望颜色根据主机名而变化,您可以更改$CC_CONTEXT
变量环境(export CC_CONTEXT="hostname"
)或简单地使用--context/-c
选项(context-color -c "hostname"
)。
请参阅下面的示例: