GNU/Linux >> Znalost Linux >  >> Linux

Jsou terminálové barevné únikové sekvence definovány kdekoli pro Bash?

Ve skriptování Bash jsem často používal barvy (většinou na CentOS), ale aby bylo jejich použití pohodlnější, nakonec jsem předefinoval proměnné na hodnoty barev:

local GRAY="\[\033[1;30m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local CYAN="\[\033[0;36m\]"
local LIGHT_CYAN="\[\033[1;36m\]"
local NO_COLOUR="\[\033[0m\]"

nebo také pomocí tput :

bold=`tput bold`
normal=`tput sgr0`
whitef=`tput setaf 7`
greenf=`tput setaf 2`
redb=`tput setab 1`

Hádal jsem kolem /etc/rc.d/init.d adresář, ale nenašel jsem v něm nic souvisejícího s definicemi barev.

Existuje již taková definice? Pokud ne, vložil bych je do souboru v /etc/rc.d/init.d řekněme a zahrnout to do mých skriptů, trochu jako s /etc/rc.d/init.d/functions

Přijatá odpověď:

V tom, na co se ptáte, je několik aspektů.

Za prvé, bash nedefinuje barvy. Ve skutečnosti bash vůbec netuší, že barvy vůbec existují. Ví jen, že jste mu řekli, aby vypsal znaky \033[0;36m . Váš emulátor terminálu (xterm, gnome-terminal, cokoliv) přijímá tyto znaky a rozumí „Potřebuji spustit výstup v azurové“.

Je to tedy váš emulátor terminálu, který rozumí barvám. Váš emulátor terminálu rozumí \033[0;36m je azurová, ale jiný terminálový emulátor může používat zcela odlišnou sadu znaků pro azurovou (ačkoli žádný rozumný terminálový emulátor by se tímto standardem neoháněl). To je důvod pro tput . Když spustíte tput setaf 6 , tput vyhledá únikové kódy vašeho terminálu pro barvu 6 (azurová) a vydá tento únikový kód.

Nyní zpět k bash. Jak jste si možná všimli, když jsem mluvil o azurové barvě, používal jsem \033[0;36m , nikoli \[\033[0;36m\] . Hranaté závorky chybí. Účelem hranatých závorek je, že při použití únikových kódů (barvy) ve výzvě musí bash vědět, které znaky se netisknou (nulová šířka, ve skutečnosti nic nezobrazují). Netisknutelné znaky tedy uzavřete do \[ \] . Pokud tyto znaky odstraníte, může se zpočátku zdát, že vše funguje dobře, ale jakmile váš příkaz překročí šířku terminálu, začnete narážet na nejrůznější podivnosti. Je to proto, že při psaní musí bash vědět, kdy má příkaz zalomit na další řádek. Za tímto účelem vypočítá šířku výzvy a poté šířku toho, kolik jste napsali.

Další poznámka o tput . CYAN="\[\033[0;36m\]" není totéž jako CYAN="$(tput setaf 6)" . Jak jsme právě diskutovali, hranaté závorky jsou relevantní pro bash a tput vypíše pouze únikové kódy terminálu.

Související:Linux – Je Linux Unix?

Vzhledem k tomu, že hranaté závorky jsou obvykle relevantní pouze ve výzvě, pokud používáte barvy ve výstupu skriptu nebo něčeho podobného, ​​neměli byste je používat. To znamená, že pokud budete používat barvy pro více než jen výzvy, musíte definovat více proměnných. Jeden s hranatými závorkami pro použití ve výzvě a jeden bez pro vše ostatní. I když můžete ručně přidat hranaté závorky pokaždé, když ve výzvě odkazujete na barvu.

Tak dlouhý příběh, pravděpodobně budete chtít definovat něco jako:

local CYAN="$(tput setaf 6)" # OR CYAN="\033[0;36m"
local LIGHT_CYAN="$CYAN$(tput bold)" # OR LIGHT_CYAN="\033[1;36m"
local PROMPT_CYAN="\[$CYAN\]"
local PROMPT_LIGHT_CYAN="\[$LIGHT_CYAN\]"

Linux
  1. Jak změnit barvu vašeho terminálu Linux

  2. Ssh – Nastavit barvy terminálu místního počítače tak, aby byly použity barvy stroje, do kterého Ssh používám?

  3. Co jsou oddělovače slov Readline?

  1. Kde jsou manuálové stránky pro C++?

  2. Jaká jsou pravidla pro platné identifikátory (např. funkce, vars atd.) v Bash?

  3. Terminál, který podporuje únikový kód ANSI kurzívou?

  1. Průvodce linuxovým terminálem pro začátečníky

  2. Bash tipy pro každý den na příkazovém řádku

  3. Jak zastavit skript Loop Bash v terminálu?