Test di LS_COLORS in zsh


10

Qualche anno fa ho trovato un frammento di codice interessante che stampa ogni tipo di file nel suo colore corrispondente in base ai colori impostati in LS_COLORS. Sfortunatamente, non ricordo più il link.

Ecco lo snippet test_colors.shin questione

eval $(echo "no:global default;fi:normal file;di:directory;ln:symbolic link;pi:named pipe;so:socket;do:door;bd:block device;cd:character device;or:orphan symlink;mi:missing file;su:set uid;sg:set gid;tw:sticky other writable;ow:other w\
ritable;st:sticky;ex:executable;"|sed -e 's/:/="/g; s/\;/"\n/g')                                                                                                                                                                            
{                                                                                                                                                                                                                                           
  IFS=:                                                                                                                                                                                                                                     
  for i in $LS_COLORS                                                                                                                                                                                                                       
  do                                                                                                                                                                                                                                        
    echo -e "\e[${i#*=}m$( x=${i%=*}; [ "${!x}" ] && echo "${!x}" || echo "$x" )\e[m"                                                                                                                                                       
  done                                                                                                                                                                                                                                      
}   

Lo snippet funziona perfettamente in bash, ma non in zsh, e non so dire perché. Quando lo eseguo zshottengo il seguente errore:

> sh .test_colors.sh
.eval_colors:1: * not found
[00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.flac=01;35:*.mp3=01;35:*.mpc=01;35:*.ogg=01;35:*.wav=01;35:m

Aggiornamento (1 novembre 2011)

Ho testato la sceneggiatura di @ Stéphane Gimenez di seguito. Ho notato che alcuni personaggi sembrano non fuggire correttamente. Qualche idea sul perché?

Risposta: vedi i commenti sulla risposta di @ Stéphane Gimenez.

                                                      inserisci qui la descrizione dell'immagine

Risposte:


7

Lo stesso scritto per zsh in un modo molto più pulito:

#!/bin/zsh

typeset -A names
names[no]="global default"
names[fi]="normal file"
names[di]="directory"
names[ln]="symbolic link"
names[pi]="named pipe"
names[so]="socket"
names[do]="door"
names[bd]="block device"
names[cd]="character device"
names[or]="orphan symlink"
names[mi]="missing file"
names[su]="set uid"
names[sg]="set gid"
names[tw]="sticky other writable"
names[ow]="other writable"
names[st]="sticky"
names[ex]="executable"

for i in ${(s.:.)LS_COLORS}
do
    key=${i%\=*}
    color=${i#*\=}
    name=${names[(e)$key]-$key}
    printf '\e[%sm%s\e[m\n' $color $name
done

Forse potresti voler sostituire \ncon uno spazio alla fine della printfcompattezza.
Stéphane Gimenez,

Grazie @ Stéphane Gimenez. Ho aggiornato il mio OP con un problema che sto riscontrando durante la stampa di alcuni personaggi usando il tuo script. Non sono sicuro che questo sia strettamente correlato alla tua sceneggiatura (potrebbe essere il mio terminale?)
Amelio Vazquez-Reina

1
@intrpc: in esecuzione zshmentre shstai utilizzando una modalità di compatibilità. O chiama il tuo script come zsh ./test_color_schemeo aggiungi virgolette doppie in giro $colore $name.
Stéphane Gimenez,

@ Stéphane Gimenez: sono stato diretto qui dalla mia domanda correlata qui: unix.stackexchange.com/questions/52659/… . La tua espansione delle abbreviazioni è molto utile. Ho tre abbreviazioni, rs, cae mhche non sono inclusi sopra. Potete per favore dirmi dove trovare le loro espansioni? Grazie.
chandra,

Interpretato da dircolors -p rs = reset, ca = capacity, mh = multi-hard_link
weldabar

3

È necessario uscire da =in ${i%=*}perché altrimenti il ​​modello di suffisso =*subisce =espansione , quindi =viene interpretato come un nome di comando. Questa è la causa * not founddell'errore.

Zsh non divide le parole su sostituzioni variabili per impostazione predefinita, quindi si $LS_COLORSespande in una sola parola. Per fare in modo che il forciclo funzioni sulle parti separate da due punti di $LS_COLORS, usare for i in $=LS_COLORS. O più idiomatico in zsh, non utilizzare IFS, ma invece specificare in modo esplicito come dividere: for i in ${(s.:.)LS_COLORS}.

La sintassi ${!x}per indicare "il valore della variabile il cui nome è $x" è specifica per bash. Zsh ha un costrutto equivalente, la P bandiera espansione di parametro : ${(P)x}.


1
Ci sono altre due ragioni per cui questo script non funziona in zsh. Nessuna suddivisione automatica delle parole per LS_COLORSe =deve essere evitata nei modelli di sostituzione.
Stéphane Gimenez,

@ StéphaneGimenez Hai ragione, grazie, ho colpito solo dove bash non è standard ma queste sono due funzioni zsh non standard che devono essere affrontate. Dovresti espandere la tua risposta per avere tutte le spiegazioni, quindi posso eliminare la mia.
Gilles 'SO- smetti di essere malvagio' il
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.