Testando LS_COLORS no zsh

10

Há alguns anos, encontrei um interessante snippet de código que imprime cada tipo de arquivo em sua cor correspondente de acordo com as cores configuradas em LS_COLORS . Infelizmente, não me lembro mais do link.

Aqui está o snippet test_colors.sh em questão

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                                                                                                                                                                                                                                      
}   

O snippet funciona muito bem em bash , mas não em zsh , e não sei dizer por quê. Quando eu executo em zsh , recebo o seguinte erro:

> 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

Atualização (1 de novembro de 2011)

Eu testei o script por @ Stéphane Gimenez abaixo. Notei que alguns personagens parecem não escapar corretamente. Alguma idéia do porquê?

Resposta: Veja os comentários na resposta do @ Stéphane Gimenez.

    
por Amelio Vazquez-Reina 14.09.2011 / 21:14

2 respostas

7

O mesmo escrito para zsh de uma maneira muito mais clara:

#!/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
    
por 15.09.2011 / 02:22
3

Você precisa escapar do = em ${i%=*} porque, caso contrário, o padrão de sufixo =* sofrerá = expansion , então = é interpretado como um nome de comando. Esta é a causa do erro * not found .

O Zsh não divide palavras em substituições de variáveis por padrão, então $LS_COLORS expande para uma única palavra. Para que o loop for opere nas partes separadas por dois-pontos de $LS_COLORS , use for i in $=LS_COLORS . Ou mais idiomaticamente em zsh, não use IFS , mas especifique explicitamente como dividir: for i in ${(s.:.)LS_COLORS} .

A sintaxe ${!x} para significar "o valor da variável cujo nome é $x " é específica de bash. O Zsh tem uma construção equivalente, o sinalizador de expansão do parâmetro P : ${(P)x} .

    
por 15.09.2011 / 01:31

Tags