将主机名散列成颜色

Hat*_*sut 7 linux unix bash command-line colors

我喜欢通过为每个主机设置特定颜色来确保我登录到正确的主机。我将我的.bashrc周围复制到不同的主机,并为每个主机使用不同的颜色对其进行编辑。

但是,我不想在每个主机上手动编辑颜色,而是在每个主机上为我的 bash 提示自动填充颜色,每个主机名都有一个独特的颜色。

我正在想象一个命令,.bashrc它获取主机名,将其转换为独特的颜色,并将其设置为 bash 提示颜色。

问题:如何在 bash 中将主机名散列成一种颜色?

它甚至可能会根据终端背景颜色对合理的颜色集进行判断。

小智 8

这可能不会根据背景获得“漂亮”的颜色,但它应该可以工作,假设默认背景颜色始终为 color 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))}')
Run Code Online (Sandbox Code Playgroud)

要分解这个:

  • tput - 输出终端控制字符串
  • setaf- 终端控制字符串;在这种情况下,set ANSI foreground
  • $(...) - BASH 可嵌套命令替换颜色参数
    • hostname - 获取主机名
    • sum - 计算主机名的简单校验和
    • awk...
    • -v ncolors=$(...)- 将 AWK 变量设置为ncolors内部命令替换的值$(...)
      • infocmp -1 - 显示当前终端类型的终端信息,每行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并打印.


ram*_*nes 6

您可能会对 感兴趣context-color,这是我根据 J Earls 的回答整理而成的: https: //github.com/ramnes/context-color

这是一个简单的脚本,执行时会根据命令输出的哈希值输出颜色。将其安装在您的某个位置后$PATH,您可以在您的中执行类似的操作.bashrc

export PS1="$(context-color -p)$PS1\[\e[0m\]"
Run Code Online (Sandbox Code Playgroud)

(哪里--prompt/-p是用于转义提示颜色的开关,以及\[\e[0m\]用于重置颜色的转义序列)

默认情况下,用于生成哈希的命令是whoami; hostname。如果您只想根据主机名更改颜色,可以更改$CC_CONTEXT环境变量 ( export CC_CONTEXT="hostname") 或仅使用--context/-c选项 ( context-color -c "hostname")。

请参阅下面的示例:

演示