परीक्षण zsh में LS_COLORS


10

कुछ साल पहले मुझे एक दिलचस्प कोड स्निपेट मिला था, जिसमें स्थापित रंगों के अनुसार प्रत्येक प्रकार की फ़ाइल को उसके अनुरूप रंग में प्रिंट किया जाता है LS_COLORS। दुर्भाग्य से, मुझे अब लिंक याद नहीं है।

यहाँ test_colors.shप्रश्न में स्निपेट है

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                                                                                                                                                                                                                                      
}   

स्निपेट बड़े काम करता है bash, लेकिन अंदर नहीं zsh, और मैं यह नहीं बता सकता कि क्यों। जब मैं इसे चलाता हूं तो मुझे zshनिम्नलिखित त्रुटि मिलती है:

> 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

अपडेट (1 नवंबर, 2011)

मैंने नीचे @ Stéphane Gimenez द्वारा स्क्रिप्ट का परीक्षण किया। मैंने देखा कि कुछ पात्र सही ढंग से बच नहीं पाते हैं। कोई विचार क्यों?

उत्तर: @ स्टीफन जिमेनेज़ के उत्तर पर टिप्पणियाँ देखें।

                                                      यहाँ छवि विवरण दर्ज करें

जवाबों:


7

एक बहुत साफ तरीके से zsh के लिए लिखा:

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

आप शायद कॉम्पैक्टनेस \nके printfलिए अंत में एक स्थान से बदलना चाहते हैं ।
स्टीफन जिमेनेज़

धन्यवाद @ स्टीफन जिमेनेज़। मैंने अपने ओपी को एक समस्या के साथ अद्यतन किया है जो मुझे आपकी स्क्रिप्ट का उपयोग करते हुए कुछ वर्णों को प्रिंट करने में हो रही है। यकीन नहीं अगर यह आपकी स्क्रिप्ट से संबंधित है, हालांकि (यह मेरा अपना टर्मिनल हो सकता है?)
अमिलियो वाज़केज़-रीना

1
@intrpc: चल रहा है zshके रूप में shअपने कुछ संगतता मोड का उपयोग कर रहे हैं। या तो अपनी स्क्रिप्ट को कॉल करें zsh ./test_color_schemeया आसपास दोहरे उद्धरण जोड़ें $colorऔर $name
स्टीफन जिमेनेज़

@ स्टीफन जिमेनेज़: मुझे यहाँ मेरे संबंधित प्रश्न से निर्देशित किया गया था: unix.stackexchange.com/questions/52659/… । संक्षिप्तीकरण का आपका विस्तार बहुत सहायक है। मैं तीन लघु रूपों, है rs, caऔर mhहै कि इसके बाद के संस्करण शामिल नहीं हैं। क्या आप कृपया मुझे बता सकते हैं कि उनके विस्तार कहां से मिलेंगे? धन्यवाद।
चंद्रा

से व्याख्या dircolors -p रु = रीसेट, सीए = क्षमता, MH = बहु hard_link
weldabar

3

आप से बचने के लिए की जरूरत =में ${i%=*}क्योंकि अन्यथा प्रत्यय पैटर्न =*से होकर गुजरती है =विस्तार , इसलिए =एक कमांड नाम के रूप में व्याख्या की है। यह * not foundत्रुटि का कारण है ।

Zsh डिफ़ॉल्ट रूप से चर प्रतिस्थापन पर शब्दों को विभाजित नहीं करता है, इसलिए $LS_COLORSएक शब्द में फैलता है। करवाने के लिए forलूप के पेट-अलग हिस्सों पर काम $LS_COLORS, उपयोग for i in $=LS_COLORS। या अधिक मुहावरे में zsh, का उपयोग नहीं करते हैं IFS, बल्कि स्पष्ट रूप से निर्दिष्ट करें कि कैसे विभाजित किया जाए for i in ${(s.:.)LS_COLORS}:।

वाक्य ${!x}का अर्थ "जिसका नाम चर है $x" का अर्थ बैश के लिए विशिष्ट है। Zsh एक बराबर निर्माण, है P पैरामीटर विस्तार झंडा : ${(P)x}


1
इस स्क्रिप्ट के zsh में काम नहीं करने के दो और कारण हैं। कोई भी स्वचालित शब्द-विभाजन LS_COLORSऔर =प्रतिस्थापन पैटर्न में भाग जाने की आवश्यकता नहीं है।
स्टेफेन जिमेनेज

@ StéphaneGimenez आप सही हैं, धन्यवाद, मैं केवल हिट करता हूं जहां बैश गैर-मानक है, लेकिन ये दो गैर-मानक zsh विशेषताएं हैं जिन्हें संबोधित करने की आवश्यकता है। आपको सभी स्पष्टीकरणों के लिए अपने उत्तर का विस्तार करना चाहिए, और फिर मैं खदान को हटा सकता हूं।
गिल्स एसओ- बुराई को रोकें '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.