Saída em cores - Bash [duplicado]

1

Eu tenho visto várias respostas, mas todas falam sobre echo . Como posso alterar a cor de uma saída de um comando no bash? Por exemplo, quero colorir a saída do comando hostname .

$ hostname 
Nameofcomputer <--- Just the output to be colored and then it returns to default color of the shell.
    
por Fenomatik 05.05.2017 / 01:12

3 respostas

2

Existem programas que já fazem isso para você, como grc , é um

generic colouriser, can be used to colourise logfiles, output of commands, arbitrary text.... configured via regexp's.

[Eunormalmentenãogostodeusarumaimagemdetexto,masnãoachoqueoStackExchangetenhaopçõesdefomratdecores]

Ouhátambém source-highlight .

Veja Existe utilitário colorizador que pode obter a saída do comando e colori-lo de acordo com o esquema predefinido? também no SuperUser

    
por 05.05.2017 / 06:57
1
tput setaf 1; hostname; tput sgr0

tput consulta o banco de dados do terminal para o recurso correspondente. Aqui setaf para definir cor ANSI 1 (vermelho), sgr0 para selecionar rendição gráfica nenhum para voltar aos atributos padrão. Em vez de tput sgr0 , você também pode usar tput op (par original) para redefinir somente a cor do plano de fundo e do primeiro plano e deixar outros atributos gráficos (negrito, sublinhado, destaque, reversão ...) sozinhos.

Alguns shells como zsh , tcsh ou fish têm suporte embutido para consultar esse banco de dados ou mapear nomes de cores para códigos ANSI (como zsh ou fish ), mas não bash .

Em zsh , usando a expansão de prompts para imprimir o nome do host em red :

print -P '%F{red}%m%f'

( %f apenas redefine a cor do primeiro plano)

Em tcsh ou zsh com o echotc embutido usando códigos termcap em vez de terminfo:

echotc AF 1; hostname; echotc me

( zsh tem echoti para os códigos terminfo setab / sgr0 como versões modernas de tput ).

Em zsh , o sinalizador de expansão do parâmetro % ativa a expansão imediata na expansão do parâmetro, portanto, você pode fazer:

red=%F{red} normal=%f

echo ${(%)red}whatever%{(%)normal}

Em zsh , você também encontrará uma função colors autoloadable que pode ser executada para ajudar os auxiliares a escrever coisas em cores:

autoload colors; colors

echo $fg[red]whatever$fg[default]
    
por 05.05.2017 / 08:23
0

Esta é uma resposta parcial que funciona em geral, mas engasga com caracteres especiais.

#!/bin/sh

case $1 in
  red)     col=$'\e[1;31m' ;;
  green)   col=$'\e[1;32m' ;;
  yellow)  col=$'\e[1;33m' ;;
  blue)    col=$'\e[1;34m' ;;
  magenta) col=$'\e[1;35m' ;;
  cyan)    col=$'\e[1;36m' ;;
esac

printf "%s" "${col}"

shift
eval $@

Uso

Supondo que seja chamado set-color , simplesmente chame-o com set-color red hostname .

Explicação

  • O bloco de casos define as cores, conforme a resposta de jasonwryan aqui .
  • O script define essa cor com printf .
  • shift remove a primeira opção fornecida ao script (ou seja, a cor).
  • eval $@ , em seguida, executa o restante do script.

Problema

O problema é que o script consome as fugas e aspas. por exemplo. se você normalmente executou.

grep "foo bar" file\ name

Então você teria que usar

set-color red grep \"foo bar\" file\ name
    
por 05.05.2017 / 04:45