सवाल मेरे 'प्रोफाइल' के साथ कुछ गड़बड़ है


मैंने हाल ही में कुछ सॉफ्टवेयर स्थापित किए हैं और उन्हें जोड़ने की जरूरत है bin/ मेरे लिए निर्देशिका PATH। अभी तक असामान्य कुछ भी नहीं। लेकिन मैंने इसके बारे में स्मार्ट होने का फैसला किया, और मेरे एक हिस्से को फिर से लिखा .profile तो मुझे कोड की समान कुछ पंक्तियों को कॉपी / पेस्ट करने की आवश्यकता नहीं थी। मेरा विचार यहां था:

# Create an array with directories to be added to PATH
declare -a addpath=("$HOME/bin" "$HOME/.cabal/bin" "/opt/vert.x/current/bin")

# Add directories recursively
for dir in "${addpath[@]}"; do
if [ -d "$dir" ]; then
    PATH="$dir:$PATH"
fi
done

मैंने सोचा कि यह अच्छी तरह से काम कर रहा है .. जब तक कि मैं अपने पीसी को रिबूट नहीं करता और लॉग इन करने का प्रयास करते समय अपने सत्र से बाहर निकल गया। मुझे यह समझने में थोड़ी देर लग गई कि यह वास्तव में मेरे कारण था .profile; एक बार जब मैंने उन पंक्तियों पर टिप्पणी की, तो मैं वापस आने के बिना अपने सत्र में लॉग इन करने में सक्षम था।

मेरा सवाल यह है कि; मैंने इन पंक्तियों के साथ क्या गलत किया? क्या कोई वाक्यविन्यास त्रुटि है? क्या ऐसा करने का कोई दूसरा / बेहतर तरीका है? क्या हुआ?


4
2017-08-19 23:55


मूल




जवाब:


में उबंटू 12.04 पर डिफ़ॉल्ट सेटअप, द .profile फ़ाइल द्वारा लोड किया जाता है /usr/sbin/lightdm-session। यह शेल स्क्रिप्ट है, द्वारा निष्पादित /bin/sh

उबंटू पर, /bin/sh है पानी का छींटा। आपने सुविधाओं का उपयोग किया है दे घुमा के वह डैश समर्थन नहीं करता है। डैश और बैश दोनों में एक ही मूल विशेषताएं हैं, लेकिन तेजी से और छोटे होने के लिए इन मुख्य विशेषताओं के लिए डैश चिपक जाती है जबकि बैश अधिक संसाधनों की आवश्यकता के दौरान कई सुविधाएं जोड़ती है। उन स्क्रिप्ट के लिए डैश का उपयोग करना आम है, जिन्हें इंटरैक्टिव उपयोग के लिए अतिरिक्त सुविधाओं और बैश की आवश्यकता नहीं है (हालांकि zsh  बहुत अच्छी विशेषताएं हैं)।

डैश में सरणी नहीं है, न ही declare अंतर्निर्मित, इसलिए यह उस रेखा पर बमबारी कर रहा है। आप इनलाइन पथों की सूची डाल सकते हैं:

for dir in "$HOME/bin" "$HOME/.cabal/bin" "/opt/vert.x/current/bin"; do
  if [ -d "$dir" ]; then
    PATH="$dir:$PATH"
  fi
done

देख स्रोत पर $ PATH से डुप्लिकेट रखें यदि आप सुनिश्चित करना चाहते हैं कि डुप्लिकेट प्रविष्टियों के साथ समाप्त न करें।


आपके द्वारा स्थापित प्रत्येक प्रोग्राम के लिए PATH में नई निर्देशिका जोड़ने की बजाय, आप इसके बजाय मौजूदा निर्देशिका में प्रतीकात्मक लिंक सेट अप करना चाहेंगे। के लिये ~/.cabal/bin, आप इसे अपने रास्ते में रखना चाहेंगे क्योंकि निष्पादन योग्य आ रहे होंगे और जा रहे हैं; हालांकि, यह आपके सिस्टम पर मौजूदा कार्यक्रमों के साथ संभावित संघर्षों से बचने के लिए, हालांकि, इसे पैथ के अंत में रखेगा। ~/bin उबंटू पर पहले से ही आपके पैथ में है। प्रोग्राम्स के लिए जो आप मैन्युअल रूप से vert.x जैसे स्थापित करते हैं, भरना या xstow प्रतीकात्मक लिंक के प्रबंधन के लिए अच्छा है। देख कार्यक्रमों का ट्रैक रखना स्टोव करने के लिए एक परिचय के लिए।


6
2017-08-20 07:40



मुझे वापस आने के लिए मुझे लेने के लिए खेद है। धन्यवाद इसलिए आपके विस्तृत उत्तर के लिए, मैंने निश्चित रूप से यहां कुछ सीखा है! - Sheljohn


मुझे लगता है कि, आपके मामले में, आदेशों के रूप में अपनी बाइनरी उपलब्ध कराने के लिए सबसे अच्छा अभ्यास है जो आपको / usr / bin के लिए आवश्यक है। $ पाथ के साथ मेस अप करना हमेशा एक अच्छी बात नहीं है।

आप इस तरह की प्रतीकात्मक लिंक बनाने के लिए 'सीपी' का उपयोग कर सकते हैं:

cp -rs $HOME/bin/* /usr/bin #This will link all non hidden files
cp -rs $HOME/bin/.[^.]* /usr/bin # This will link all the hidden files

अपने वर्तमान कोड के समान तर्क का उपयोग करके बस इसे अपने परिदृश्य में अनुकूलित करें।

संपादित करें: यदि आप dotglob को सेट करते हैं तो आप उपर्युक्त कोड की केवल पहली पंक्ति का उपयोग कर सकते हैं सच बैश पर इस कदर:

shopt -s dotglob #This will make Bash include filenames beginning with a '.' in the results of filename expansion
cp -rs $HOME/bin/* /usr/bin #Now, this will link ALL files in that directory to the destination

संपादित करें 2: जैसा कि आप नीचे दी गई टिप्पणियों में पढ़ सकते हैं, बेहतर है कि आप / usr / bin / के बजाय / usr / local / bin का उपयोग करें। समझने के लिए टिप्पणियां पढ़ें क्यों।


-2
2017-08-20 00:59



यह बिल्कुल विपरीत है। आपको कभी गड़बड़ नहीं करनी चाहिए /usr/bin, पैकेज प्रबंधक इसे प्रबंधित करने दें। आप प्रोग्राम जोड़ सकते हैं /usr/local/bin, लेकिन प्रतीकात्मक लिंक के रूप में, प्रतियों के रूप में नहीं। - Gilles
यदि आप मेरा कोड पढ़ते हैं, तो आप देखेंगे कि मैं प्रतियों का उपयोग नहीं कर रहा हूं। 'सीपी' प्रतिलिपि बनाने के बजाय प्रतीकात्मक लिंक लिख सकते हैं। यह अधिक सरल है जो सभी प्रतीकात्मक लिंक 'एलएन' के साथ बनाते हैं। उबंटू (जो वास्तव में एक पैकेज मैनेजर का उपयोग करता है) पर / usr / bin के बारे में आप जो कहते हैं वह आधा सच हो सकता है लेकिन यह वैश्विक सत्य नहीं है, याद रखें। पी एस .: लिनक्स दुनिया पर कभी भी एक अजीब शब्द नहीं है। जाहिर है, आप ऐसा कर सकते हैं (और सभी मामलों पर काम करेंगे)। यहां अंतर यह है कि / usr / bin मेजबान-प्रबंधित सॉफ़्टवेयर होस्ट करता है, और / usr / local / bin अन्य सॉफ़्टवेयर होस्ट करता है। लेकिन यह एक सम्मेलन है, तकनीकी समस्या नहीं। - Alexandre Teles
ओह, ठीक है, मैं चूक गया था -s। लेकिन मेरे आपत्ति का मुख्य हिस्सा अभी भी खड़ा है: गड़बड़ मत करो /usr/bin। यह उबंटू पर और किसी भी अन्य यूनिक्स पर सच है। निश्चित रूप से, यह भौतिकी का कानून नहीं है। यह एक सम्मेलन है, जैसे सड़क के एक निश्चित पक्ष पर ड्राइविंग। कुछ सम्मेलन महत्वपूर्ण हैं। - Gilles
@AlexandreTeles आपके उत्तर के लिए बहुत बहुत धन्यवाद। मुझे पता है कि डाउनवॉटेड बहुत निराशाजनक हो सकता है; आपका इरादा मदद करना था, और आपको बदले में "दंडित" मिला। मैं इसके बारे में वास्तव में क्षमा चाहता हूं (मैंने खुद को कम नहीं किया, भले ही मुझे चाहिए)। सच्चाई यह है कि आप वास्तव में गलत हैं, लेकिन मैं आपको निम्नलिखित दो लेख पढ़ने के लिए प्रोत्साहित करता हूं ताकि यह पता चल सके कि क्यों: wiki.debian.org/FilesystemHierarchyStandard और फिर unix.stackexchange.com/questions/11544/...। सही मायने में तुम्हारा :) - Sheljohn