कैसे मैं $ PATH में एक निर्देशिका के सभी उपनिर्देशिका सेट कर सकता हूं?


38

ऐसा लगता है जब $ PATH में एक निर्देशिका जोड़ते समय, इसके उपनिर्देशिका को पुनरावर्ती रूप से नहीं जोड़ा जाता है। तो क्या मैं ऐसा कर सकता हूं? या कोई कारण है कि यह समर्थित क्यों नहीं है?


5
पृथ्वी पर आपको इसकी आवश्यकता क्यों है?
एलेक्स

10
@alex: आपको क्यों लगता है कि कोई ज़रूरत नहीं है?
टिम

4
@ कारण है कि यह "आम तौर पर" समर्थित नहीं है यह एक सुरक्षा जोखिम है और आमतौर पर इसकी आवश्यकता नहीं है। यदि आप अपने मार्ग पर निर्देशिकाओं को पुन: जोड़ते हैं, जो जानते हैं कि वहां क्या अटक सकता है ... यह ऑडिट करने के लिए बहुत कठिन है।
Xenoterracide

4
@ समय: यह वास्तव में आश्चर्यजनक और असामान्य चीज है, यही कारण है कि।
एलेक्स

8
@alex बिन निर्देशिका में उपनिर्देशिकाओं के बारे में क्या? मैं बिन फ़ोल्डर में निर्देशिकाओं में स्क्रिप्ट को व्यवस्थित करना पसंद करूंगा।
एंडी

जवाबों:


19

उन्हें पुन: उपयोग में लाएँ ताकि वे इस तरह मिलें:

PATH=$PATH$( find $HOME/scripts/ -type d -printf ":%p" )

चेतावनी: जैसा कि इस सवाल का टिप्पणी में उल्लेख नहीं किया गया है क्योंकि यह सुरक्षा जोखिम पैदा करता है क्योंकि इसमें कोई गारंटी नहीं है कि निर्देशिका में निष्पादन योग्य फाइलें जोड़ी गई दुर्भावनापूर्ण नहीं हैं।

गिल्स के उत्तर का पालन करना और स्टोव का उपयोग करना शायद एक बेहतर उपाय है


6
चेतावनी: यह उत्तर तकनीकी रूप से सही है, लेकिन एलेक्स और xenoterracide नोट के रूप में यह करने के लिए एक पागल-असुरक्षित चीज़ है और आपको वास्तव में इसका उपयोग करने से पहले दो बार निश्चित रूप से सोचना चाहिए।
कालेब

2
कृपया अपने उत्तर के बारे में एक चेतावनी जोड़ें कि यह व्यवहार में एक अच्छी, सुरक्षित चीज क्यों नहीं है।
कालेब

3
मैं इसे विशेष रूप से खतरनाक नहीं मानूंगा ; यादृच्छिक निर्देशिकाओं को जोड़ना $PATHखतरनाक है, लेकिन उपनिर्देशिकाओं को जोड़ना स्पष्ट रूप से बदतर नहीं है। लेकिन यह आमतौर पर बेकार है , और संभवतः अक्षम है (और कभी-कभी आपको पर्यावरण के आकार की सीमाओं पर भी फेंक सकता है)।
गाइल्स का SO- बुराई को रोकना '

3
@ कालेब: पागल शायद, लेकिन असुरक्षित क्यों? यदि किसी के पास उपखंडों में दुर्भावनापूर्ण निष्पादन योग्य फ़ाइलों को जोड़ने के लिए पहुंच है, तो वह उन्हें माता-पिता की डायर (यानी, ~/binया ~/scripts) में भी जोड़ सकता है , इसलिए उनकी सुरक्षा समान है।
MestreLion

2
सुरक्षा जोखिम यदि आप ऐसे वातावरण में काम करते हैं जहां यादृच्छिक लोग आपके लिए दुर्भावनापूर्ण फ़ाइलों को जोड़ सकते हैं ~/scripts। मुझे नहीं करना चाहिए और न ही किसी और को
oseiskar

21

सामान्य यूनिक्स निर्देशिका संरचना में एप्लिकेशन फ़ाइलों को निर्देशिकाओं में क्रमबद्ध किया गया है: binनिष्पादन के लिए, libपुस्तकालयों के लिए, docप्रलेखन के लिए और इसी तरह। जब वे अलग-अलग निर्देशिकाओं में स्थापित होते हैं; अक्सर अनुप्रयोगों में कुछ निर्देशिकाओं (इसलिए कई प्रणालियों में सिर्फ तीन निर्देशिका है में बांटा गया है $PATH: /usr/local/bin, /usr/binऔर /bin)। किसी निर्देशिका के अंदर निष्पादन योग्य फ़ाइलों और उपनिर्देशिकाओं दोनों को रखना दुर्लभ है, इसलिए निर्देशिका की उपनिर्देशिकाओं को शामिल करने की कोई मांग नहीं है $PATH

क्या कभी-कभी उपयोगी हो सकता binहै किसी दिए गए निर्देशिका के उपनिर्देशिका के सभी उपनिर्देशिका को शामिल करना है $PATH:

for d in /opt/*/bin; do PATH="$PATH:$d"; done

हालाँकि, ऐसा कम ही होता है। सामान्य पद्धति जब गैर-मानक निर्देशिकाओं में निष्पादन योग्य होती है, तो इस तरह $PATHके मार्ग में एक निर्देशिका में प्रतीकात्मक लिंक बनाना होता है /usr/local/binstowउपयोगिता (या xstow) इस संबंध में उपयोगी हो सकता है।


4

एक कारण यह है कि यह समर्थित नहीं है क्योंकि बिन / (और इसी तरह) निर्देशिका विशिष्ट निर्देशिका को इंगित करने के लिए प्रतीकात्मक लिंक का उपयोग करती है जहां कार्यक्रमों के लिए वास्तविक निष्पादन योग्य स्थापित होते हैं।

इसलिए, यदि आपका $PATHशामिल है /usr/local/bin(जो कि यह सबसे अधिक संभावना है), वह फ़ोल्डर प्रतीकात्मक लिंक (जैसे ruby) से भरा है जो उस विशिष्ट निर्देशिका को इंगित करता है जहां माणिक चलाने का कोड पाया जाता है (जैसे ../Cellar/ruby/2.1.3/bin/ruby)।

यही कारण है कि आपको अपने निष्पादन योग्य फ़ोल्डर को अपने में निर्दिष्ट करने की आवश्यकता नहीं है $PATH; प्रतीकात्मक लिंक कस्टम बिन / प्रकार निर्देशिकाओं में पाया कि आप के लिए संभाल।


1

में zsh , $ पथ एक सरणी के रूप में संलग्न किया जा सकता। आप $ PATH सरणी में कई उपनिर्देशिकाओं को जोड़ने के लिए शेल ग्लोबिंग का उपयोग कर सकते हैं।

उदाहरण:

इन .zshrc:

typeset -U PATH path
BINPATH="$HOME/bin"
path+=("$BINPATH" ${BINPATH}/*/)
export PATH

यह $ BINPATH की सभी उपनिर्देशिकाओं को $ PATH सरणी में जोड़ देगा।

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