ऐसा लगता है जब $ PATH में एक निर्देशिका जोड़ते समय, इसके उपनिर्देशिका को पुनरावर्ती रूप से नहीं जोड़ा जाता है। तो क्या मैं ऐसा कर सकता हूं? या कोई कारण है कि यह समर्थित क्यों नहीं है?
ऐसा लगता है जब $ PATH में एक निर्देशिका जोड़ते समय, इसके उपनिर्देशिका को पुनरावर्ती रूप से नहीं जोड़ा जाता है। तो क्या मैं ऐसा कर सकता हूं? या कोई कारण है कि यह समर्थित क्यों नहीं है?
जवाबों:
उन्हें पुन: उपयोग में लाएँ ताकि वे इस तरह मिलें:
PATH=$PATH$( find $HOME/scripts/ -type d -printf ":%p" )
चेतावनी: जैसा कि इस सवाल का टिप्पणी में उल्लेख नहीं किया गया है क्योंकि यह सुरक्षा जोखिम पैदा करता है क्योंकि इसमें कोई गारंटी नहीं है कि निर्देशिका में निष्पादन योग्य फाइलें जोड़ी गई दुर्भावनापूर्ण नहीं हैं।
गिल्स के उत्तर का पालन करना और स्टोव का उपयोग करना शायद एक बेहतर उपाय है
$PATH
खतरनाक है, लेकिन उपनिर्देशिकाओं को जोड़ना स्पष्ट रूप से बदतर नहीं है। लेकिन यह आमतौर पर बेकार है , और संभवतः अक्षम है (और कभी-कभी आपको पर्यावरण के आकार की सीमाओं पर भी फेंक सकता है)।
~/bin
या ~/scripts
) में भी जोड़ सकता है , इसलिए उनकी सुरक्षा समान है।
~/scripts
। मुझे नहीं करना चाहिए और न ही किसी और को
सामान्य यूनिक्स निर्देशिका संरचना में एप्लिकेशन फ़ाइलों को निर्देशिकाओं में क्रमबद्ध किया गया है: 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/bin
। stow
उपयोगिता (या xstow
) इस संबंध में उपयोगी हो सकता है।
एक कारण यह है कि यह समर्थित नहीं है क्योंकि बिन / (और इसी तरह) निर्देशिका विशिष्ट निर्देशिका को इंगित करने के लिए प्रतीकात्मक लिंक का उपयोग करती है जहां कार्यक्रमों के लिए वास्तविक निष्पादन योग्य स्थापित होते हैं।
इसलिए, यदि आपका $PATH
शामिल है /usr/local/bin
(जो कि यह सबसे अधिक संभावना है), वह फ़ोल्डर प्रतीकात्मक लिंक (जैसे ruby
) से भरा है जो उस विशिष्ट निर्देशिका को इंगित करता है जहां माणिक चलाने का कोड पाया जाता है (जैसे ../Cellar/ruby/2.1.3/bin/ruby
)।
यही कारण है कि आपको अपने निष्पादन योग्य फ़ोल्डर को अपने में निर्दिष्ट करने की आवश्यकता नहीं है $PATH
; प्रतीकात्मक लिंक कस्टम बिन / प्रकार निर्देशिकाओं में पाया कि आप के लिए संभाल।
में zsh , $ पथ एक सरणी के रूप में संलग्न किया जा सकता। आप $ PATH सरणी में कई उपनिर्देशिकाओं को जोड़ने के लिए शेल ग्लोबिंग का उपयोग कर सकते हैं।
उदाहरण:
इन .zshrc
:
typeset -U PATH path
BINPATH="$HOME/bin"
path+=("$BINPATH" ${BINPATH}/*/)
export PATH
यह $ BINPATH की सभी उपनिर्देशिकाओं को $ PATH सरणी में जोड़ देगा।