LS_COLORS ürününü zsh olarak test etme


10

Birkaç yıl önce, ayarlanan renklere göre her dosya türünü karşılık gelen renkte basan ilginç bir kod snippet'i buldum LS_COLORS. Ne yazık ki, artık bağlantıyı hatırlayamıyorum.

İşte snippet'idir test_colors.shsöz konusu

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                                                                                                                                                                                                                                      
}   

Parçacık harika çalışıyor bash, ama çalışmıyor zsh, nedenini söyleyemem. Ben çalıştırdığınızda zshaşağıdaki hatayı alıyorum:

> 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

Güncelleme (1 Kasım 2011)

Senaryoyu aşağıdaki @ Stéphane Gimenez tarafından test ettim. Bazı karakterlerin doğru kaçamayacağını fark ettim. Neden herhangi bir düşünce?

Cevap: @ Stéphane Gimenez'in cevabı hakkındaki yorumlara bakın.

                                                      resim açıklamasını buraya girin

Yanıtlar:


7

Aynı şey zsh için çok daha temiz bir şekilde yazılmış:

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

Belki de kompaktlık \nsonunda bir boşluk ile değiştirmek isteyebilirsiniz printf.
Stéphane Gimenez

Teşekkürler Stéphane Gimenez. OP'mi komut dosyası kullanarak bazı karakterleri yazdırırken karşılaştığım bir sorunla güncelledim. Bu kesinlikle betiğinizle ilgili olup olmadığından emin değilim (bu benim kendi terminalim olabilir mi?)
Amelio Vazquez-Reina

1
@intrpc: bazı uyumluluk modunu kullandığınız zshgibi çalışıyor sh. Ya gibi komut aramak zsh ./test_color_schemeveya çift tırnak eklemek $colorve $name.
Stéphane Gimenez

@ Stéphane Gimenez: Burada ilgili sorumdan yönlendirildim: unix.stackexchange.com/questions/52659/… . Kısaltmaları genişletmeniz çok yardımcı olur. Üç kısaltmalar var rs, cave mhyukarıda yer almamaktadır. Onların açılımlarını nerede bulacağımı söyler misiniz? Teşekkürler.
chandra

Dan yorumlanır dircolors -p rs = sıfırlama, ca = yeteneği, mh = çoklu hard_link
weldabar

3

Kaçmak gerek =de ${i%=*}aksi sonek modeli nedeniyle =*uğrar =genişleme , yani =bir komut ismi olarak yorumlanır. * not foundHatanın nedeni budur .

Zsh, varsayılan olarak değişken ikamelerdeki kelimeleri bölmez, bu nedenle $LS_COLORStek bir kelimeye genişler. Sağlamak için fordöngü kolon ayrılmış parça üzerinde işlem $LS_COLORSkullanımı for i in $=LS_COLORS. Ya da daha deyimsel zsh içinde, kullanmayın IFS, bunun yerine bölünmüş nasıl açıkça belirtin: for i in ${(s.:.)LS_COLORS}.

${!x}“Adı olan değişkenin değeri” anlamına gelen sözdizimi $xbash'a özgüdür. Zsh eşdeğer yapı, sahip P parametre genişleme işareti : ${(P)x}.


1
Bu komut dosyasının zsh içinde çalışmamasının iki nedeni daha var. İkame kalıpları için otomatik kelime ayırma işlemi yapılmaz LS_COLORSve =ikame kalıplarında kaçması gerekir.
Stéphane Gimenez

@ StéphaneGimenez Haklısın, teşekkürler, sadece bash'ın standart olmadığı yere vurdum ama bunlar da ele alınması gereken standart dışı iki zsh özelliğidir. Tüm açıklamaları almak için cevabınızı genişletmelisiniz ve sonra benimkileri silebilirim.
Gilles 'SO- kötü olmayı bırak'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.