題 將主機名散列為一種顏色


我想通過為每個主機提供特定顏色來確保我已登錄到正確的主機。我複制我的 .bashrc 周圍到不同的主機,並為每個主機編輯不同的顏色。

但是,我不想手動編輯每個主機上的顏色,而是自動為每個主機上的bash提示填充顏色,每個主機名都有一個獨特的顏色。

我在想像一個命令 .bashrc 獲取主機名,將其轉換為唯一顏色,並將其設置為bash提示顏色。

題: 如何在bash中將主機名散列為一種顏色?

它甚至可以根據終端背景顏色判斷合理顏色的集合。


6
2017-09-12 22:48


起源


寫一個 case 關於內容的聲明 hostname (這意味著您必須使用每個主機的條目編輯.bashrc一次,然後您可以將其複製到所有主機)。自動做出“合理”的選擇並不是一件容易的事(什麼顏色在什麼樣的背景上很好看),你可能不會喜歡這個結果。但是當然你可以用某種方式對主機名進行散列並將其用作顏色。 - dirkt
同樣,你可能不喜歡這個結果,但是將IP地址的第一個或最後3個數字直接散列到RGB是相對微不足道的。 - Tetsujin


答案:


這可能不會得到基於背景的“漂亮”顏色,但它應該工作,假設默認背景顏色始終是顏色 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  - 每行顯示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 並打印出來。

8
2017-09-14 13:43





你可能感興趣 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。如果您只想根據主機名更改顏色,則可以更改 $CONTEXT 可變環境(export CONTEXT="hostname"或者只是使用 --context/-c 選項 (context-color -c "hostname")。

請參閱下面的示例:

demo


3
2018-03-15 17:52



嗨ramnes;僅強烈建議不要使用鏈接(即使'基於'另一個答案')。請仔細閱讀 如何在我的答案推薦軟件。 - bertieb
你是對的,謝謝你的提醒。我已經編輯了答案,現在應該會更好。請告訴我你是否覺得還不夠。 - ramnes
很多改進:)我也加了你漂亮的GIF,希望你不介意! - bertieb
非常歡迎你。我利用您的編輯請求來編輯我的README。謝謝! - ramnes