Способи оплати Abuse

Кольори терміналу Linux

26.09.2021, 22:47

Перевага Linux полягає в тому, що за бажання в ньому можна налаштувати все, що завгодно. У цьому і виражається перевага проективних систем над процедурними. Це своєрідний конструктор, що складається з окремих блоків, кожен з яких можна налаштувати за своїм бажанням.

Особливо цікаво, якщо не просто копіюєш готові рішення, а намагаєшся розібратися, що і як влаштовано. І навіть вирішуючи несерйозне завдання, дізнаєшся щось нове.

Розфарбовуємо кольори виведення

Наприклад, вам захотілося налаштувати кольори терміналу linux у виводі команди ls.

З документації до ls можна зрозуміти, що встановлення кольорів для виведення здійснюється за допомогою утиліти dircolors, яка або встановлює параметри кольору зі своєї власної бази, або бере їх із файлу ~/.dircolors. Також згадувалося, що ініціалізація використання кольорів відбувається через ~/.bashrc, файл із налаштуваннями командної оболонки, а самі параметри визначаються через змінну LC_COLORS.

У .bashrc виявився скрипт такого змісту:

Його суть зводиться до перевірки на наявність утиліти dircolors у системі, присвоювання значення змінній і, в разі вдалого виконання, використання параметра --color=auto під час кожного виклику ls.

Якщо запустити утиліту dircolors, вона виводить значення змінної LC_COLOR.

Також можливе виведення значення змінної LC_COLORS у структурованому вигляді, зазначенням ключа:

$ dircolors -p

Оскільки висновок виходить довгий, наводити його не буду.

Якщо переспрямувати виведення dircolors -p > ~/.dircolors, то буде створено структурований файл, з якого і будуть братися налаштування кольорів. Редагуючи цей файл і встановлюються налаштування кольору для виведення ls.

У створеному файлі .dircolors є підказка:

Встановлюючи послідовність через крапку з комою, отримуємо потрібний нам колір у консолі linux, згідно з переліченими. Кольори терміналу linux від 30 до 37 для кольору шрифту, а з 40 до 47 для фону. Наприклад:

DIR 01;34 передбачає, що імена директорій будуть виділятися жирним шрифтом і синім кольором.

Але таким способом виходить лише вісім кольорів, а сучасні емулятори терміналу здатні виводити як мінімум 256.

Існують і інші способи встановлення кольору. Наприклад, значення EXEC 38;5;208;1 - дає помаранчевий товстий шрифт у виконуваних файлів.

Щоб не перебирати кольори linux вручну, є вже готова таблиця кольорів

Підставляючи в значення кольору 38;5;x - де x колір із таблиці, отримуємо необхідний результат. Виходить щось на кшталт цього:

Як це працює? Річ у тім, що встановлення кольору виведення інформації в емуляторі термінала здійснюється за допомогою ANSI escape-кодів. Це певна послідовність символів, яка не виводиться на екран, проте впливає на виведення. Називається вона так, оскільки починається з [ - коду "Esc". Оскільки терміналів та емуляторів терміналів існує безліч, ці керуючі коди стандартизовані. Керування кольором через послідовність від 30 до 37 - це стандарт ECMA-48. Інформація про нього міститься в розділі console_codes.

Розфарбовуємо рядок запрошення

Розібравшись, як встановлювати кольори linux через esc-коди, не важко буде переробити і розфарбувати рядок запрошення. За його виведення відповідає змінна PS1, яка визначена у файлі ~/.bashrc

У Linux Mint скрипт її ініціалізації має такий вигляд:

Тобто спершу визначається, чи запустив скрипт root або звичайний користувач. Оскільки в переважній більшості випадків має місце саме другий варіант, то і редагувати потрібно рядок, наступний після першого 'else'. Формат рядка розшифровано в документації по баш, у розділі "Promting". З нього випливає, що esc-послідовність має починатися з "[" і закінчуватися "]". Таким чином:

  • [[01;32m] - встановлює зелений колір;
  • u - виводить ім'я користувача;
  • h - виводить ім'я хоста;
  • [[00m] - очищає встановлені атрибути;
  • [[01;34m] - встановлює синій колір;
  • w - виводить ім'я робочої директорії;
  • Привіт! - приклад того, що може бути виведений будь-який похідний текст.

Що ще можна вивести в рядку запрошення:

  • d - дату, у форматі "Wed Dec 28";
  • A - час у 24-годинному форматі;
  • ! - номер поточної команди в історії;
  • - перенесення виведення на інший рядок;

Введемо щось цікавіше:

PS1='${debian_chroot:+($debian_chroot)}[[01;32m]Matrix has you,u![[00m] [[01;34m]Blue pill[[00m] or [[31m]red?[[00m]--->$ '

І рядок запрошення набуде вигляду: