7

Я хотел бы убедиться, что я вошел в правильный хост, имея определенный цвет для каждого хоста. Я копирую свой .bashrc на разные хосты и редактирую его разными цветами для каждого.

Однако я не хотел бы вручную редактировать цвет на каждом хосте, а вместо этого автоматически заполнял цвета для моего приглашения bash на каждом хосте, с отличительным для каждого имени хоста.

Я представляю команду в .bashrc которая получает имя хоста, превращает его в уникальный цвет и устанавливает его в качестве цвета приглашения bash.

Вопрос: Как я могу хэшировать имя хоста в цвет в bash?

Он может даже принять решение о наборе разумных цветов на основе цвета фона терминала.

2 ответа2

8

это может не получить "красивый" цвет на основе фона, но он должен работать, предполагая, что цвет фона по умолчанию всегда равен 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 и напечатайте его.
3

Возможно, вас заинтересует context-color , который я собрал на основе ответа J Earls: https://github.com/ramnes/context-color

Это простой скрипт, который при выполнении выводит цвет на основе хеша вывода команды. Установив его где-нибудь в вашем $PATH , вы можете сделать что-то подобное в вашем .bashrc:

export PS1="$(context-color -p)$PS1\[\e[0m\]"

(где --prompt/-p - это параметр, позволяющий экранировать цвет для подсказок и \[\e[0m\] escape-последовательность для сброса цвета)

По умолчанию для создания хэша используется команда whoami; hostname Если вы просто хотите, чтобы цвет менялся в соответствии с именем хоста, вы можете изменить переменную среду $CONTEXT (export CONTEXT="hostname") или просто использовать опцию --context/-c (context-color -c "hostname") ,

Смотрите ниже пример:

демонстрация

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .