Testen von LS_COLORS in zsh


10

Vor einigen Jahren habe ich ein interessantes Code-Snippet gefunden, das jeden Dateityp in der entsprechenden Farbe entsprechend den in eingerichteten Farben druckt LS_COLORS. Leider kann ich mich nicht mehr an den Link erinnern.

Hier ist das test_colors.shfragliche Snippet

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                                                                                                                                                                                                                                      
}   

Das Snippet funktioniert gut in bash, aber nicht in zsh, und ich kann nicht sagen warum. Wenn ich es zsheinführe, wird folgende Fehlermeldung angezeigt:

> 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

Update (1. November 2011)

Ich habe das Skript von @ Stéphane Gimenez unten getestet. Mir ist aufgefallen, dass einige Charaktere nicht richtig entkommen. Irgendwelche Gedanken warum?

Antwort: Siehe Kommentare zur Antwort von @ Stéphane Gimenez.

                                                      Geben Sie hier die Bildbeschreibung ein

Antworten:


7

Das gleiche gilt für zsh viel sauberer:

#!/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

Möglicherweise möchten Sie aus Gründen \nder printfKompaktheit durch ein Leerzeichen am Ende des ersetzen .
Stéphane Gimenez

Danke @ Stéphane Gimenez. Ich habe mein OP mit einem Problem aktualisiert, das beim Drucken einiger Zeichen mit Ihrem Skript auftritt. Ich bin mir nicht sicher, ob dies eng mit Ihrem Skript zusammenhängt (es kann mein eigenes Terminal sein?)
Amelio Vazquez-Reina

1
@intrpc: Wird ausgeführt, zshwenn shSie einen Kompatibilitätsmodus verwenden. Rufen Sie Ihr Skript entweder als auf zsh ./test_color_schemeoder fügen Sie doppelte Anführungszeichen um $colorund hinzu $name.
Stéphane Gimenez

@ Stéphane Gimenez: Ich wurde von meiner verwandten Frage hier hierher geleitet: unix.stackexchange.com/questions/52659/… . Ihre Erweiterung der Abkürzungen ist sehr hilfreich. Ich habe drei Abkürzungen, rs, caund mhdass nicht enthalten ist oben. Können Sie mir bitte sagen, wo ich ihre Erweiterungen finden kann? Vielen Dank.
Chandra

Interpretiert von dircolors -p rs = zurücksetzen, ca = Fähigkeit, mh = multi-hard_link
Weldabar

3

Sie müssen die entkommen =in ${i%=*}da sonst die Suffix Muster =*erfährt =Expansion , so =als Befehlsnamen interpretiert wird. Dies ist die Ursache des * not foundFehlers.

Zsh teilt standardmäßig keine Wörter bei Variablensubstitutionen und wird daher $LS_COLORSzu einem einzelnen Wort erweitert. Verwenden Sie, um die forSchleife an den durch Doppelpunkte getrennten Teilen von $LS_COLORSauszuführen for i in $=LS_COLORS. Oder idiomatischer in zsh, verwenden Sie nicht, IFSsondern geben Sie explizit an, wie aufgeteilt werden soll : for i in ${(s.:.)LS_COLORS}.

Die Syntax ${!x}für "den Wert der Variablen, deren Name lautet $x" ist spezifisch für bash. Zsh hat ein äquivalentes Konstrukt, das P Parametererweiterungsflag : ${(P)x}.


1
Es gibt zwei weitere Gründe, warum dieses Skript in zsh nicht funktioniert. Keine automatische Wortteilung für LS_COLORSund =muss in Substitutionsmustern maskiert werden.
Stéphane Gimenez

@ StéphaneGimenez Du hast Recht, danke, ich habe nur festgestellt, wo Bash nicht Standard ist, aber dies sind zwei nicht Standard Zsh-Funktionen, die ebenfalls angesprochen werden müssen. Sie sollten Ihre Antwort erweitern, um alle Erklärungen zu erhalten, und dann kann ich meine löschen.
Gilles 'SO - hör auf böse zu sein'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.