Cambia carattere nel comando echo


16

È possibile modificare gli attributi dei caratteri dell'output di echo in zsh o bash?

Quello che vorrei è qualcosa di simile a:

echo -n "This is the font: normal "
echo -n $font=italic "italic,"
echo -n $font=bold "bold,"
echo -n "and"
echo -n $font=small "small".

in modo che stampi: "Questo è il carattere: normale, corsivo , grassetto , piccolo " all'interno di una riga di testo.


Ciò ha più a che fare con l'emulatore di terminale in questione che con la shell utilizzata. Questo thread di domande contiene alcuni suggerimenti preziosi, credo
sr_

Normalmente, non è possibile modificare la dimensione del carattere. L'unica cosa che di solito puoi fare è cambiare colore e talvolta l'attributo grassetto / sottolineato. Per questo, è possibile utilizzare sequenze di escape ANSI. Vedi ad esempio bashguru.com/2010/01/shell-colors-colorizing-shell-scripts.html per alcuni esempi.
jofel,

Risposte:


15

Sulla maggior parte, se non su tutti gli emulatori di terminali, non è possibile impostare caratteri di dimensioni o caratteri diversi, solo colori e alcuni attributi (grassetto, sottolineato, straordinario).

In bash (o in zsh o in qualsiasi altra shell), puoi usare il terminale direttamente le sequenze di escape (a parte alcune esotiche, tutti i terminali seguono l'esempio di xterm in questi giorni). CSIè ESC [scritto $'\e['in bash. La sequenza di escape per modificare gli attributi è CSI Ps m.

echo $'\e[32;1mbold red\e[0mplain\e[4munderlined'

Zsh ha una funzione conveniente per questo.

autoload -U colors
colors
echo $bold_color$fg[red]bold red${reset_color}plain$'\e'$color[underline]munderlined

16

È possibile includere queste definizioni di colore in uno script o in un file di origine. Potrebbe assomigliare a questo.

#!/bin/bash
PATH=/bin:/usr/bin:

NONE='\033[00m'
RED='\033[01;31m'
GREEN='\033[01;32m'
YELLOW='\033[01;33m'
PURPLE='\033[01;35m'
CYAN='\033[01;36m'
WHITE='\033[01;37m'
BOLD='\033[1m'
UNDERLINE='\033[4m'

echo -e "This text is ${RED}red${NONE} and ${GREEN}green${NONE} and ${BOLD}bold${NONE} and ${UNDERLINE}underlined${NONE}."

tput sgr0

Si noti che è necessario reimpostare i codici colore ANSI dopo ogni istanza in cui si richiama una modifica. I tput sgr0resetta tutte le modifiche apportate nel terminale.

Credo che cambiare la dimensione del carattere o il corsivo sia specifico per il terminale che stai usando.

Mentre questa guida è specifica per personalizzare il tuo prompt di bash, è un buon riferimento per i codici colore e genera alcune idee su cosa puoi fare.


5

Sembra che il layout non sia in grado di gestire il [0x1b]carattere di fronte a[ .

La prima riga rende grassetto:

 echo -e "\x1b[1m bold"
     echo -e "\x1b[30m black"
     echo -e "\x1b[31m red"
     echo -e "\x1b[32m green"
     echo -e "\x1b[33m yellow"
     echo -e "\x1b[34m blue"
     echo -e "\x1b[35m mag"
     echo -e "\x1b[36m cyan"
     echo -e "\x1b[37m white"   

Per il tipo generale, lo so solo

echo -e "\x1b[0m io-std"
echo -e "\x1b[1m bold"
echo -e "\x1b[2m normal"

e dai commenti, grazie a Manatwork e GypsyCosmonaut:

echo -e "\x1b[3m italic"
echo -e "\x1b[4m underlined"
echo -e "\x1b[5m blinking"
echo -e "\x1b[7m inverted"

e non conosco la differenza tra io-std e normale.

Non ho visto corsivo o piccolo nella shell.

Puoi inserirli (grazie anche all'opera d'arte) di Ctrl + v ESC in Bash, dove verrà visualizzato come ^[. Ciò significa che l'intera sequenza ANSI sarà simile ^[[1m boldo ^[[1mbold(per evitare lo spazio vuoto prima di 'grassetto').

Molti editor hanno problemi con (char) 0x1b. Alternative: copiarlo / incollarlo da qualche parte o utilizzarlo

echo -e "\x1b[1m bold"

in bash o un editor esadecimale.


1
I caratteri di escape possono essere digitati: Ctrl + V, Esc. (Verrà visualizzato come "^ [". Ciò significa che l'intera sequenza ANSI apparirà come "^ [[1mbold".)
manatwork

1
Ci sono più attributi da menzionare: \e[4msottolineato, \e[5mlampeggiante, \e[7minvertito.
arte

@manatwork: li ha aggiunti.
utente sconosciuto

@userunknown Grazie per l'aiuto, armeggiare con il tuo codice, ho scoperto che il corsivo èecho -e "\x1b[3m italic"
GypsyCosmonaut

0

Qui:

http://en.wikipedia.org/wiki/ANSI_escape_code

(nota: molti di solito non funzionano, ma la maggior parte di questi sono contrassegnati in questo modo.)

Sto realizzando un gioco nel terminal e ho fatto molto affidamento sul link sopra. Ti dice anche come nascondere / scoprire il cursore, rendere il colore (anni '30), "grassetto" (più chiaro), più scuro, sottolineato, corsivo, colore di sfondo (anni '40 anziché anni '30), ecc. Puoi anche cambiare la posizione del cursore ( che è molto utile - ad esempio, "\x1B[1A"sposta il cursore su una riga; "\x1B[0;0H"sposta il cursore sulla riga 0, col 0; "\x1B[2J"cancella lo schermo;"\x1B[2K" cancella la riga.

Per i tuoi scopi, come hanno detto le persone:

echo -e "\x1b[30;44m black with blue background \x1b[m"

echo -e "\x1b[31;42m red with green background \x1b[m"

echo -e "\x1b[32;40m green with black background \x1b[m"

echo -e "\x1b[8m Invisible; na na na na boo boo \x1b[m"

Nota: è necessario il -ein

echo **-e** "\x1b[35;1m Light purple \x1b[m"

oppure devi utilizzare virgolette singole. Digita man echoper capire perché (le doppie virgolette sono di solito una seccatura durante la stampa; quando ho bisogno di cose per non espandermi o ho bisogno di sequenze di escape ANSI, uso le virgolette singole perché è facile - anche se mi sono abituato a farlo così tante volte - dimenticare -e nel qual caso si ottiene " box with numbers and letters[35; 1m").

Ogni volta che vedi CSIsostituiscilo con "\x1b["(o "\e["o "\u1b["). "\x1b["Penso che sia più standard, ma non so davvero quale sia la differenza tra loro.


Se ti piace ingombrare le tue stringhe con caratteri extra, non usare \ e :-)
chiarisci il

@clearlight Non sono sicuro di cosa intendi. Penso che potresti voler dire "usa \ e". Tuttavia, \eè meno supportato di quello \x1bche ho trovato. La cosa ottimale da fare sarebbe o esc=$'\e'o esc=$'\x1b'(questo è in bash) e quindi usare "${esc}[34;1m"(ad esempio, blu brillante). Ho un esempio semi-complesso qui ( github.com/dylnmc/ps1porn/blob/master/powerline.sh ) per una stringa di prompt bash reale;) Per favore perdona il nome del repository - puoi ringraziare le persone nel canale # di freenode # archlinux-offtopic per quello.
Dylan,

Il motivo per cui esc=$'\e'è ciò è che ciò consente a bash di creare sul posto il personaggio ansi-escape, e tu ne trarrai beneficio in un paio di modi. A volte, infatti, (come è dimostrato nel link github), è necessario utilizzare questo metodo per far apparire correttamente il colore. Per le versioni precedenti di bash e sh shell, è necessario (ma non è necessario) utilizzare questo metodo per mostrare il colore ... dato che il terminale utilizza le sequenze di escape che fanno la maggior parte dei terminali moderni.
Dylan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.