एक मल्टी-लाइन सिंटैक्स का उपयोग करके पथ में पथ जोड़ना


16

जहां तक ​​मैं समझता हूं, PATHपर्यावरण चर के लिए एक रास्ता जोड़ने का सामान्य तरीका :चरित्र द्वारा अलग किए गए पथों को जोड़ना है ।

उदाहरण के लिए, यदि मैं इसमें तीन रास्ते जोड़ना चाहता हूं /my/path/1, /my/path/2और /my/path/3, मुझे इसे निम्नानुसार करना होगा:

PATH=$PATH:/my/path/1:/my/path/2:/my/path/3

जिसे पढ़ना आसान नहीं है।

वहाँ का कोई तरीका है परिभाषित या जोड़ने के लिए पथ PATHचर एक का उपयोग कर बहु लाइन सिंटेक्स ? शायद सरणियों का उपयोग करना? मैं कुछ इस तरह की तलाश में हूँ:

PATH = 
$PATH
/my/path/1
/my/path/2
/my/path/3

मामले में दिलचस्प समाधान हैं जो शेल विशिष्ट हैं, मैं zsh में समाधान ढूंढ रहा हूं।

जवाबों:


12

मुझे नहीं पता कि क्या यह zsh में काम करता है, लेकिन यह बाश में काम करता है:

PATH=$(paste -d ":" -s << EOF 
$PATH
/my/path/1
/my/path/2
/my/path/3
EOF
)

संपादित करें और यहां तक ​​कि कम:

PATH=`paste -d ":" -s << EOF 
$PATH
/my/path/1
/my/path/2
/my/path/3
EOF`

और एक प्रक्रिया को जन्म दिए बिना:

new_path=(
"$PATH"
/my/path/1
/my/path/2
/my/path/3)
OLD_IFS="$IFS"
export IFS=":"
PATH="${new_path[*]}"
export IFS="$OLD_IFS"

दोहरे उद्धरण चिह्नों रहे हैं महत्वपूर्ण arround $PATH, $IFS, ${new_path[*]}और $OLD_IFSभारतीय विदेश सेवा के चर और से बचने के खोल व्याख्या में रिक्त स्थान रखने के लिए।

अपडेट 2 और टिप्पणियों और खाली लाइन प्रबंधन के साथ sed का उपयोग कर:

PATH=`sed -e '/^#/'d -e '/^$/'d << EOF | paste -d ":" -s 
$PATH
/my/path/1
# This is a comment.
/my/path/2

/my/path/3
EOF`

टिप्पणी वर्ण लाइन पर 1 वर्ण होना चाहिए, और खाली लाइनें पूरी तरह से खाली होनी चाहिए। टिप्पणी से पहले और खाली लाइनों पर रिक्त स्थान और टैब का प्रबंधन करने के लिए, sed -e '/^[ \t]*#/'d -e '/^[ \t]*$/'dइसके बजाय का उपयोग करें (परीक्षण किए जाने वाले टैब जैसा कि यह sed कार्यान्वयन के लिए विशिष्ट हो सकता है)।


मैंने आखिरी स्निपेट का परीक्षण zsh में किया और यह काम करता है। मुझे यह भी पसंद है कि यह अन्य समाधानों की तुलना में थोड़ा क्लीनर (प्रति पंक्ति एक पथ) है। क्या समाधान टिप्पणी लाइनों (पथ) के साथ हो सकता है? कैसे खाली लाइनों के बारे में?
अमिलियो वाज़केज़-रीना

टिप्पणियों और खाली लाइन प्रबंधन के साथ अद्यतन करें।
jfg956

और सीड के साथ, यदि आप खेलना चाहते हैं, तो आप अधिक जटिल स्क्रिप्ट के साथ पेस्ट प्रक्रिया से बच सकते हैं।
jfg956

क्या pasteसमाधान में रास्तों के लिए इंडेंटेशन का उपयोग करना ठीक है ?
void.pointer

20

एक दिलचस्प समाधान बिल्कुल नहीं, लेकिन बहुत पोर्टेबल:

PATH=${PATH}:/my/path/1
PATH=${PATH}:/my/path/2
PATH=${PATH}:/my/path/3

1
यह वर्षों से मैंने जो कुछ देखा है, उसके लिए विशिष्ट है। कोई आसानी से पथों को पुन: व्यवस्थित कर सकता है या यहां तक ​​कि PATH = / my / path / 1: $ {PATH} होने के लिए एक तत्व को बदलने के लिए मजबूर कर सकता है।
bsd 15

1
आप +=स्ट्रिंग को पूरी तरह से पुनर्निर्माण करने से बचने के लिए भी उपयोग कर सकते हैं ।
क्रिस डाउन

और आपको ब्रेसिज़ का उपयोग करने की भी आवश्यकता नहीं है। कॉलोनों का उपयोग पर्यावरण चर नामों में नहीं किया जा सकता है इसलिए हल करने के लिए कोई अस्पष्टता नहीं है।
अलेक्सियो

दिलचस्प नहीं होने के लिए +1। दिलचस्प कभी-कभी अच्छा हो सकता है, लेकिन यह उन समयों में से एक नहीं है! (विशेषकर जब से ओपी ने स्पष्ट रूप से "पढ़ने में आसान नहीं है" को एक समस्या के रूप में उल्लेख किया है।)
19

@ क्रिसडाउन क्या एक वाक्यविन्यास है जो स्ट्रिंग के पुनर्निर्माण के बिना प्रीपेंड करता है?
जॉन पी

12

Zsh में, $pathएक सरणी है:

path=(
    $path
    ~/.local/bin
    ~/.gem/ruby/2.0.0/bin
)

नोट: दोनों pathलोअरकेस है।


यह शेल पर निर्भर करता है, सभी इसे संभालते नहीं हैं।
वॉनब्रांड

1
@vonbrand: हाँ, लेकिन zsh में काम करता है। मुझे लगता है कि यह उल्लेख के लायक है।
कबि

3
+1 (यह सवाल zsh टैग किया गया है )
Johnsyweb

चूंकि ओपी ने विशेष रूप से zsh के बारे में पूछा था, इसलिए यह सबसे अच्छा विकल्प है
डैनियल सेरोडियो

1
$ पथ बनाम $ पाथ भेद के बारे में अधिक जानने के इच्छुक किसी व्यक्ति के लिए इस पोस्ट को देखें
mbigras

7

Zsh में, यदि आप पथ के अंत में निर्देशिका जोड़ रहे हैं:

path+=/my/path/1
path+=/my/path/2
path+=(/path/to/app/{i386,share}/bin)

आंशिक रूप से: सही तरीके से पथ में कैसे जोड़ें?

आप ऐसी प्रविष्टियों को बाहर करने के लिए ग्लोब क्वालिफायर का उपयोग कर सकते हैं जो मौजूदा निर्देशिका या ऐसी प्रतीकात्मक लिंक नहीं हैं। यह वांछनीय हो सकता है या नहीं भी हो सकता है, इस पर निर्भर करता है कि आप निर्देशिकाओं को संभवतः सत्र के दौरान बाद में जोड़े जाने की अपेक्षा करते हैं (जैसे कि यदि वे दूरस्थ फाइल सिस्टम पर हैं)। आप path+=/my/pathसिंटैक्स के साथ ऐसा नहीं कर सकते क्योंकि दाएं हाथ एक स्ट्रिंग संदर्भ में है और इसलिए ग्लोबिंग से गुजरना नहीं है; आप इसे path+=(/my/path)तब से कर सकते हैं जब एक सूची संदर्भ में प्रत्येक सरणी तत्व का विस्तार किया जाता है।

path+=(/path/to/app/{i386,share}/bin(-/N))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.