Zsh के साथ $ पथ और $ PATH (लोअरकेस बनाम अपरकेस) में क्या अंतर है?


13

में FreeBSD 12, का उपयोग कर zshखोल, मैं जब को देखकर इस अंतर पर ध्यान $path(लोअरकेस) बनाम $PATH(अपरकेस)।

echo $path

/ sbin / bin / usr / sbin / usr / bin / usr / स्थानीय / sbin / usr / स्थानीय / बिन / usr / घर / freebsd / बिन

echo $PATH

/ Sbin: / बिन: / usr / sbin: / usr / bin: / usr / स्थानीय / sbin: / usr / स्थानीय / बिन: / usr / घर / FreeBSD / bin

एक आउटपुट SPACE कैरेक्टर द्वारा डिले किया गया है, दूसरा COLON कैरेक्टर द्वारा।

Difference अंतर क्यों?

क्या ये दो अलग-अलग, अलग-अलग चर हैं? या क्या लोअरकेस / अपरकेस किसी तरह की ट्रिक को ट्रिगर करता है या जिसका अर्थ मुझे नहीं पता है?

क्या यह एक zshविशेषता है? या FreeBSD की एक विशेषता?


1
एक तरफ: किसी भी POSIX- संगत शेल में, किसी भी लोअरकेस वर्णों के साथ चर नामों को आवेदन के उपयोग के लिए सुरक्षित किया जाता है (बदले जाने पर शेल या सिस्टम व्यवहार को चुपचाप संशोधित करने के लिए नहीं)। यह उन स्थानों में से एक है जहां zsh का निर्णय केवल उस मानक का पालन करना है जहां उनके लिए यह समझ में आता है कि वे स्क्रिप्ट लेखकों के लिए सिरदर्द बना सकते हैं, क्योंकि मानकीकृत गारंटी लागू नहीं होती है।
चार्ल्स डफी

@CharlesDuffy क्या आपके पास मानक के उस हिस्से का लिंक है जहां वह निचले और ऊपरी मामले के चर के बारे में कोई भी कहता है? धन्यवाद।
मच्छी

@mosvy, pubs.opengroup.org/onlinepubs/9699919799/basedefs/… - इसे ध्यान में रखते हुए पढ़ें कि शेल और पर्यावरण चर एक ही नाम स्थान साझा करते हैं (शेल चर सेट करना किसी भी मौजूदा समान नाम वाले पर्यावरण चर का मान अद्यतन करता है; वातावरण चर सेट करना शेल चर को आरंभ करता है)। विशिष्ट रेखाएँ: लोअरकेस अक्षरों वाले पर्यावरण चर नामों का नाम स्थान अनुप्रयोगों के लिए आरक्षित है। अनुप्रयोग मानक उपयोगिताओं के व्यवहार को संशोधित किए बिना इस नाम स्थान से नामों के साथ किसी भी पर्यावरण चर को परिभाषित कर सकते हैं।
चार्ल्स डफी

@CharlesDuffy जो यहां लागू नहीं होता है। स्थापना pathके अंदर zshकिसी भी अपडेट नहीं करेंगे pathenvvar: path=junk zsh -c 'echo $path; path=garbage; /usr/bin/printenv path'
मच्छी

@mosvy, आपने मुझे आश्वस्त किया है कि यह मानक के पत्र का उल्लंघन नहीं करता है। भावना , दूसरे हाथ पर, होगा for path in "$dir"/*reflexively सुरक्षित करने के लिए लिखने कोड।
चार्ल्स डफी

जवाबों:


20

यह / zshसे विरासत में मिली एक विशेषता है ।cshtcsh

$path सरणी चर है बंधे को $PATH अदिश (स्ट्रिंग) चर। एक पर कोई संशोधन दूसरे में परिलक्षित होता है।

में zsh(के विपरीत (t)csh), आप बगल में अन्य चर टाई कर सकते हैं $PATHके साथ typeset -T। यह पारंपरिक है, लेकिन अनिवार्य नहीं है, बृहदान्त्र-पृथक स्केलर के लिए एक अपरकेस नाम का उपयोग करना और सरणी के लिए लोअरकेस में समान नाम। जबकि कोलोन डिफ़ॉल्ट विभाजक है, अन्य विभाजकों का उपयोग किया जा सकता है (उदाहरण के लिए एक सरणी में एक बहु-पंक्ति स्ट्रिंग को टाई करने के लिए newline, या अरै के लिए एक csv पंक्ति टाई करने के लिए अल्पविराम)

हाल के संस्करणों में zsh, typeset -p PATHया typeset -p pathदो चर के बीच लिंक दिखाता है:

% typeset -p path
typeset -aT PATH path=( /home/chazelas/bin /usr/local/bin /usr/bin /bin )

यह उपयोगी है कि इससे घटकों को हटाने या उन पर लूप जोड़ना आसान हो जाता है।

एक कर typeset -U pathतत्वों बनाने के लिए अद्वितीय भी रखने में मदद करता $PATHचर स्वच्छ (कुछ इसी में प्राप्त किया जा सकता tcshके साथ set -f)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.