मैं वाक्य रचना की खट्टी फाइलों की जांच से कैसे रोक सकता हूं?


9

मेरे पास एक फ़ाइल में निम्नलिखित कोड है जो zsh और bash दोनों द्वारा सोर्स किया गया है।

if test $SHELLNAME = zsh ; then
    lss() { l -l ${1:-.}/*(s,S,t); }
    laf() { l ${1:-.}/.*(.); }
    lad() { l -d ${1:-.}/.*(/); }
    lsw() { l -ld ${1:-.}/.*(R,W,X.^ND/); }
fi

SHELLNAMEहै zshअगर खोल zsh है और bashअगर खोल bash है।

उपरोक्त प्रत्येक फ़ंक्शन में कोड होता है जो zsh के साथ काम करता है, लेकिन बैश नहीं।

जब मैं इस फ़ाइल को स्रोत करता हूं, तो मुझे निम्नलिखित त्रुटियां प्राप्त होती हैं।

bash: <filename>: line 67: syntax error near unexpected token `('
bash: <filename>: line 67: `     lss() { l -l ${1:-.}/*(s,S,t); }'

फिलहाल, मैं evalबैश के सिंटैक्स चेकिंग को बायपास करने के लिए उपयोग कर रहा हूं ।

if test $SHELLNAME = zsh ; then
    # Using eval makes sure bash can't try to syntax-check these functions.
    eval 'lss() { l -l ${1:-.}/*(s,S,t); }'
    eval 'laf() { l ${1:-.}/.*(.); }'
    eval 'lad() { l -d ${1:-.}/.*(/); }'
    eval 'lsw() { l -ld ${1:-.}/.*(R,W,X.^ND/); }'
fi

क्या इस समस्या का कोई बेहतर समाधान है? (शायद एक है कि उपयोग नहीं करता है eval)

bash  zsh 

जवाबों:


14

आप केवल एक eval की जरूरत है।

[ -n "$ZSH_VERSION" ] &&
  eval '
    lss() l -l ${1:-.}/*(s,S,t)
    laf() l ${1:-.}/.*(.)
    lad() l -d ${1:-.}/.*(/)
    lsw() l -ld ${1:-.}/.*(R,W,X.^ND/)
  '

(ध्यान दें कि बॉर्न फ़ंक्शन सिंटैक्स का समर्थन zshकरने के विपरीत है bash)

या:

[ -n "$ZSH_VERSION" ] && . /dev/fd/3 3<< '# End of zsh specific section'
  lss() l -l ${1:-.}/*(s,S,t)
  laf() l ${1:-.}/.*(.)
  lad() l -d ${1:-.}/.*(/)
  lsw() l -ld ${1:-.}/.*(R,W,X.^ND/)
# End of zsh specific section

लेकिन मैं इस बात से सहमत होना चाहता हूं slmकि zshएक अलग फ़ाइल में विशिष्ट सिंटैक्स होने से ही इसका zshफायदा होगा।


कोड में डालने के लिए धन्यवाद, जो मैं केवल शब्दों में सोच सकता था 8-)।
SLM

15

कोशिश करने के बजाय और बैश को सिंटैक्स चेक न करें, क्यों न आपकी स्क्रिप्ट हो जो इस एकमात्र स्रोत की सोर्सिंग कर रही हो जब इसे सही शेल द्वारा बुलाया जा रहा हो।


फ़ाइल को बैश और zsh दोनों द्वारा सॉर्ट किया गया है। मैं हालांकि zsh विशिष्ट भागों को अपनी फ़ाइल में विभाजित करने के बारे में सोच रहा हूँ।

6
हाँ, यह वही है जो मैं करूँगा। यह स्पष्ट है कि भविष्य में कोड में आने वाले किसी और के लिए सड़क के नीचे और खुद के लिए समर्थन और समर्थन करना स्पष्ट है। कोड में मैं हमेशा चालाक के बजाय स्पष्ट के लिए प्रयास करता हूं।
SLM
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.