सवाल मुझे अपने मैक पर पैथ वैरिएबल कैसे सेट करना चाहिए ताकि होम्ब्रे-स्थापित टूल्स पाए जाए?


स्थापित करने की कोशिश कर रहा है homebrew एक नए मैक पर (पिछले मैक पर मैं स्रोत से संकुल स्थापित करता हूं)।

स्थापित करने का प्रयास करने वाला पहला पैकेज गिट था:

$ brew install git

स्थापना ठीक हो गई, लेकिन which git अभी भी एक दिखाता है /usr/bin/git साथ आया था शेर (मुझे लगता है?)। और में एक नहीं /usr/local/bin/git वह बस स्थापित किया गया था।

$ echo $PATH
/Users/meltemi/.rvm/gems/ruby-1.9.2-p290@rails31/bin:/Users/meltemi/.rvm/gems/ruby-1.9.2-p290@global/bin:/Users/meltemi/.rvm/rubies/ruby-1.9.2-p290/bin:/Users/michael/.rvm/bin:/usr/local/mysql/bin:/opt/subversion/bin:/Developer/Additions/checker/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

जैसा कि आप देख सकते हैं /usr/bin पहले के लिए डिफ़ॉल्ट /usr/local/bin में $PATH

तो, मैं उलझन में हूँ! मैंने सोचा था homebrew (और रचनाकारों के बारे में कुछ ऐसा लगता है) यह था कि आपको इसके साथ गड़बड़ नहीं करना है $PATH चर!?!

तो मैंने क्या गलत किया?


79
2017-08-17 19:36


मूल


क्या आपने पहले अपने रास्ते से गड़बड़ की और शायद उन्हें गलत क्रम में रखा? इसके अलावा मुझे यकीन नहीं है कि यह एक "उग्र बिंदु" रूप होमब्री क्यों है ... यह किसी पथ की अवधारणा की तरह नहीं है या इसे संशोधित करना एक जटिल चीज है जिसमें विशेष अनुमतियों या कुछ के साथ आपके सिस्टम में 10 अलग-अलग plists को संलेखन और छिड़कना शामिल है .. .. - prodigitalson
पथ, अच्छी तरह से वह हिस्सा जो आरवीएम से संबंधित नहीं है, मानक मुद्दा होना चाहिए। और नहीं, मैं पथ बदलने के बारे में शिकायत नहीं कर रहा हूं। यह सिर्फ इतना है कि वे दावा दोहराते हैं If you choose /usr/local, everything 'just works!' मुझे आश्चर्य है कि मुझे क्या याद आ रहा है ... क्योंकि यह "बस काम नहीं करता" है। - Meltemi


जवाब:


मैंने इस संबंधित पोस्ट को बहुत उपयोगी पाया। बदलने के बजाय $PATH परिवर्तनीय, यह सिर्फ आप बस संपादित करें /etc/paths फ़ाइल।

होमब्रू चाहता है कि मैं अपने पैथ में संशोधन करूं; कोई सुराग कैसे

जैसे ही मैंने दिशानिर्देशों का पालन किया और डाल दिया /usr/local/bin ऊपर /usr/bin, मेरे मुद्दों का समाधान किया गया था।

  1. ओएस एक्स पर, टर्मिनल खोलें
  2. आदेश टाइप करें: sudo vi /etc/paths
  3. अगर आपसे पूछा जाता है तो अपना पासवर्ड दर्ज करें
  4. आप पथों की एक सूची देखेंगे। उन्हें संपादित करें ताकि /usr/local/bin पथ ऊपर से दर्ज किया गया है /usr/bin पथ
  5. *सेव करके छोड़ो
  6. टर्मिनल पुनरारंभ करें

यहां ऐसा करने के बाद मेरा क्या दिखता है:

/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

* एक कोलन टाइप करने और छोड़ने के लिए (:), फिर टाइप करें wq (एक ही समय में लिखने और छोड़ने के लिए), उसके बाद दर्ज

आप भी खोल सकते हैं /etc/paths एक ग्राफिकल पाठ संपादक में फ़ाइल करें और इसे इस तरह संपादित करें।

को श्रेय fengd वहां पर उनके जवाब के लिए स्टैक ओवरफ्लो पर।


73
2018-01-13 22:35



Vi dimwits (मेरे जैसे) के लिए डी का उपयोग करें और पी को कम करने के लिए इसे कमांड मोड में पेस्ट करें - Gerard
मैं इसके साथ सावधानी बरतूँगा - बेहतर जवाब है .profile / .bash_profile में पथ को संशोधित करना और इसे वहां निर्यात करना। / Etc / पथ बदलकर, आप (संभावित रूप से) सभी सिस्टम प्रक्रियाओं को प्रभावित करते हैं; .profile / .bash_profile में PATH को बदलना आपके खाते और प्राथमिकता को कमांड शैल के माध्यम से आवंटित करता है (जो, मेरे विकास के मामले में, जो मैं चाहता हूं)। यदि आप वास्तव में सतर्क हैं, तो आप नीचे दिए गए उत्तर में @Aristotle Pagaltzis का सुझाव दे सकते हैं। - rholmes
क्या कोई बात है जब आप इस बात पर विचार करना बंद कर देते हैं कि कुछ गलत गलत है कि ओएसएक्स के लिए डिज़ाइन किए गए पैकेज मैनेजर से एक साधारण इंस्टॉल आउट-ऑफ-द-बॉक्स में विफल रहा है? अपना रास्ता बदलना एक संभावित रूप से तोड़ने वाला "फिक्स" और बीटीडब्लू है, इस प्रस्तावित फिक्स पर मैंने ठोकर खाई है कि ब्रू मेरे पथ को अपडेट करने में विफल रहता है, लेकिन "पथ" पहले से ही सही क्रम में है। एक और मृत अंत। पागलपन को रोकें, मूल कारण को ठीक करें। - Rick O'Shea
इसके अलावा, वहाँ है path_helper तथा /etc/paths.d। - Simon Wright


यह जवाब अप्रचलित है। पसंदीदा होमब्रू PATH ऑर्डरिंग को समझाया गया था, लेकिन यह अब सत्य नहीं है। हालांकि, दृष्टिकोण अधिक आम तौर पर लागू होता है, इसलिए ब्याज के लिए, मैं इसे छोड़ रहा हूं।


आपको नहीं करना चाहिए

होमब्री जानबूझकर रखता है /usr/local/bin  बाद  /usr/bin अधिकतम संगतता के लिए पथ में। इन निर्देशिकाओं के क्रम को उलटाना PATH संपादन करके /etc/paths इसका मतलब होगा सब सिस्टम पर कहीं भी प्रोग्राम, कोई फर्क नहीं पड़ता कि वे कैसे शुरू किए गए थे, एक कमांड का होमब्रू संस्करण प्राप्त होगा। लेकिन कुछ विशेष रूप से ऐप्पल के संस्करण की अपेक्षा कर सकते हैं, या सिर्फ एक नए संस्करण, आदि का उपयोग करने में सक्षम नहीं हो सकते हैं।

इस सिद्धांत को कैसे संरक्षित करें और अभी भी होमब्रू-स्थापित संस्करण प्राप्त करें git? जैसा कह रहा है, सभी समस्याओं को संकेत की एक परत के साथ हल किया जा सकता है (संकेत के बहुत से परतों को छोड़कर)। - या इस मामले में, जैसा कि यह निकलता है, दो परतें।

विशेष रूप से, यह मेरी यूनिक्स आदतों का हिस्सा रहा है ~/bin निर्देशिका जो मैंने शुरू की थी PATH। यह मेरे पहले बिट्स में से एक है .bashrc:

[[ :$PATH: == *:$HOME/bin:* ]] || PATH=$HOME/bin:$PATH

यह जांचता है कि क्या PATH शामिल ~/bin, और यदि नहीं, तो इसे पूर्ववत करता है। उस जगह के साथ, फिर चुनिंदा होमब्री-प्रबंधित कर रहे हैं git सिस्टम संस्करण (इसके बजाए) पर प्राथमिकता लें हर एक होमब्रू-प्रबंधित बाइनरी), और केवल आपके खोल सत्रों के लिए (इसके बजाए सब प्रोग्राम जीयूआई प्रोग्राम सहित कहीं से भी शुरू हुए), इसे सिम्लिंकिंग के रूप में सरल है:

ln -s /usr/local/bin/git ~/bin/git

आप सकता है सिमलिंक /usr/local/Cellar/git/1.8.2.1/bin/git सीधे, लेकिन फिर आपको हर बार अपना सिम्लिंक ठीक करना होगा brew upgrade git (प्रत्यक्ष या परोक्ष रूप से)। होमब्री के फिक्स्ड-लोकेशन सिम्लिंक को सिम्लिंक करके, आपको इसके बारे में चिंता करने की ज़रूरत नहीं है।

तो आप अपनी निर्देशिका जोड़ते हैं $HOME तो आप इसे जोड़ सकते हैं PATH इसलिए आप एक सिम्लिंक को सिमलिंक कर सकते हैं, और यह आपकी समस्या को हल करता है और डॉ सीस पर मुस्कान डालता है। यो डॉग I herd आप symlinks पसंद है तो हम आपके रास्ते में डाल दिया PATH इसलिए जब आप symlink करते हैं तो आप symlink कर सकते हैं।


28
2018-04-09 23:28



बढ़िया, यह वास्तव में जवाब देता है कि मैं क्या सोच रहा था! - mydogisbox
यह SEEMS सही उत्तर की तरह हैं, लेकिन मैं चलाने के लिए सटीक आदेशों को नहीं समझ सकता। Symlinks बनाते समय मैं "फ़ाइल मौजूद" प्राप्त करता रहता हूं। - Ryan
आपकी मदद करने के लिए पर्याप्त जानकारी नहीं है, क्षमा करें। - Aristotle Pagaltzis
@Ryan सुनिश्चित करें कि आपके पास सही तर्कों का क्रम है ln आदेश। पहला पथ लक्ष्य है, और दूसरा सिम्लिंक है - Freedom_Ben
सच है कि, एल कैप पर, मैं अप्रचलित उत्तर में विफल रहा और (zSH का उपयोग करता हूं) .zshrc में पथ के क्रम को संपादित करना export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin" - Urs


आपने कुछ भी गलत नहीं किया है, लेकिन ऐसा लगता है कि अगर आपके पास यह स्पष्ट है /usr/local/bin पहले अपने रास्ते में /usr/bin यह विशिष्ट समस्या दूर चली जाएगी। सबसे आसान फिक्स बस ऐसा करना है और कुछ ऐसा करना है

export PATH=/usr/local/bin:$PATH

आपके में ~/.bash_profile तो होमब्री इंस्टॉल करता है सब कुछ पहले पाया जाता है। यही तरीका है कि मैंने इसे अपने मैक पर स्थापित किया है, और इसने मेरे लिए लंबे समय तक काम किया है, हालांकि, वाईएमएमवी।

ऐसा लगता है कि उनका मानना ​​है कि यह काम करेगा /usr/local/bin किया जा रहा है बाद  /usr/bin, इसलिए जब मैंने अपना खुद का मजा लिया हो $PATH, मैं देख सकता हूं कि उनके दस्तावेज़ में कहां कमी है:

ध्यान दें कि आपको रखना चाहिए /usr/local/bin बाद /usr/bin   क्योंकि कुछ कार्यक्रम सिस्टम संस्करण प्राप्त करने की उम्मीद करेंगे,   उदाहरण के लिए, रूबी, और ब्रेक अगर उन्हें नया होमब्रू संस्करण मिलता है।

से विकी और ब्रू डॉक्टर # 10738 के बीच विसंगति। ध्यान दें कि यह दस्तावेज़ कहने जा रहा है, "एफएक्यू (उपर्युक्त उद्धरण) जीयूआई ऐप्स के लिए पथ सेटिंग को संदर्भित करता है; डॉक्टर (रखने की सलाह /usr/local/bin से आगे /usr/bin आपके पीएटीएच में) सीएलआई ऐप्स के लिए पैथ सेटिंग को संदर्भित करता है। "


16
2017-08-17 19:42



क्या यह दो नहीं छोड़ेगा /usr/local/binमेरे में है $PATH? मुझे ऐसा विश्वास है। मुझे आश्चर्य है कि हमें इसके बजाय डिफ़ॉल्ट पथों के क्रम को संपादित करना चाहिए /etc/paths या की सामग्री /etc/paths.d? लेकिन यह हर उपयोगकर्ता को प्रभावित करेगा ... शायद एक बुरी बात नहीं। वैसे भी, सिर्फ यह देखना चाहता था कि अन्य लोगों ने इसका कैसे संपर्क किया है। - Meltemi
@Meltemi, इस उत्तर की भावना सही है: अपना अपडेट करें PATH (आपके चयन के तरीके में) है /usr/local/bin पूर्व में होना /usr/bin। मैं व्यक्तिगत रूप से अपना अद्यतन करता हूं PATH में .bash_profile जैसा कि यहां सुझाव दिया गया है।
@ निक- दिलचस्प जानकारी ... और केवल मामलों को भ्रमित करने में काम करता है (कम से कम मेरे मायने रखता है) ... होमब्रू दस्तावेज़ों का अर्थ यह है कि टर्मिनल कमांड में ऐप्स को चुनना चाहिए /usr/local/binभले ही यह ट्रेल्स /usr/bin रास्ते में लेकिन जीयूआई ऐप्स को विशेष कोडिंग की आवश्यकता है? ऐसा लगेगा सब ऐप्स, जीयूआई या नहीं, हमें $ PATH चर समायोजित करने की आवश्यकता है। तो, मैं (या होमब्रू निर्माता) क्या लापता हूं? - Meltemi
मुझे लगता है कि होमब्रू मानता है कि आप ऐप्पल आपूर्ति किए गए निष्पादन योग्य पहले-गिट का उपयोग करना चाहते हैं, क्योंकि शेर तक इसे ऐप्पल द्वारा आपूर्ति नहीं किया गया था, इस प्रकार होमब्रू को इसकी आवश्यकता थी - अब आप ऐप्पल का उपयोग कर सकते हैं, - Mark
मैं इस पर मार्क के साथ सहमत हूं। मैकपॉर्ट्स और फिंक के साथ, धारणा बॉक्स से बाहर की गई ऐप्पल से पूरी तरह से पुरानी, ​​अलग वातावरण प्रदान करना था। होमब्रे ने इस दृष्टिकोण को लिया कि ऐप्पल की चीजें बहुत अच्छी हैं और इसका उपयोग करने से बचने के लिए नहीं (ऐप्पल की इच्छा होने पर जीसीसी का दूसरा संस्करण क्यों डाउनलोड करें?)। - Nick Klauer


मैं jthomas के जवाब से असहमत हूँ। आपके / etc / paths फ़ाइल को संपादित करने से सभी प्रोग्राम्स के लिए लोड पथ बदल जाएंगे। यह खतरनाक हो सकता है यदि कोई सिस्टम एप्लिकेशन बाइनरी के विशिष्ट संस्करण को ढूंढने की अपेक्षा कर रहा है लेकिन एक अलग संस्करण पाता है क्योंकि आपने अपनी पथ फ़ाइल संपादित की है। इसके बजाय, ~ / .bashrc (या ~ / .bash_profile) में अपना पथ चर बदलें। फिर आपका लोड पथ टर्मिनल के अंदर ही बदल जाएगा:

# पाथ में होमब्री ऐप जोड़ें
  निर्यात पथ = / पथ / से / homebrew / ऐप / बिन: $ पाथ

फिर बैश पुनः लोड करें या source ~/.bashrc, और आप जाने के लिए अच्छे हैं। चूंकि होमब्री पथ किसी और चीज से पहले आता है, इसलिए बैश उस संस्करण को लोड करेगा जिसे आपने होमब्री के साथ डाउनलोड किया था।


6
2018-04-03 19:28



ओएस एक्स में, .bashrc डिफ़ॉल्ट रूप से लोड नहीं है। क्या आप इसे मैन्युअल रूप से स्रोत करते हैं? - slhck
अरे हां। मैं उबंटू से ओएस एक्स से आया था और इसका इस्तेमाल किया जाता था .bashrc इसलिए मैं इसे अपने स्रोत से स्रोत करता हूं .bash_profile। अगर आप आरसी फाइल नहीं बनाना चाहते हैं, तो आप कमांड को जोड़ सकते हैं .bash_profile। - Nathan


जैसा मुझे समझ में आया, brew कुछ भी नहीं डालता है /usr/local/bin एक टक्कर (एक ही नाम है) एक ऐप्पल वितरित निष्पादन योग्य। इसलिए, होने /usr/local/bin पहले रास्ते में /bin तथा /usr/bin कोई मुद्दा नहीं होना चाहिए, क्योंकि कोई नाम टकराव नहीं होना चाहिए। * हालांकि, मुद्दों के साथ देखें ls तथा tar, और अन्य पैकेज एग्रीगेटर्स का उपयोग करना fink तथा port (मैकपॉर्ट्स), नीचे रास्ता।

Brew दो चीजों में से एक जो मुझे पता है कि नाम टकराव प्रबंधित करने में मदद करता है:

  1. Brew सेलर में अनलिंक kegs छोड़ देता है।सामान स्थापित करने के लिए, ब्रू उन उपकरणों को छोड़ देता है जहां वे हैं, और इन उपकरणों के प्रतीकात्मक लिंक बनाता है /usr/local/bin। उपकरण के लिए जो brew नाम टकराव नहीं चाहता है, यह एक प्रतीकात्मक लिंक नहीं बनाता है।
  2. कई लोगों के लिए यदि सभी मानक उपकरण भी नहीं हैं /bin तथा /usr/bin, brew लिंक में उपसर्ग करता है /usr/local/bin एक "जी" के साथ, उदाहरण के लिए, एक प्रदर्शन करने के लिए ls एक ब्रू संस्करण के साथ, उपयोग करें gls  बस एक करो ls -l में /usr/local/bin और लिंक की गई फाइलों की तलाश करें - वे हैं brew वहां पर रखें। ध्यान दें brew इंस्टॉल किए गए टूल्स जिन्हें उनके वास्तविक नामों से एक्सेस किया जाना चाहिए /usr/local/Cellar/coreutils/8.21/libexec/gnubin

मैं नहीं डालता /usr/local/bin मेरे रास्ते में दो कारणों से - वे कारण मेरे उत्तर के नीचे हैं।

अपने सिस्टम में नाम टकराव का आकलन करने के लिए, उपयोग करें brew doctor और इस खंड के लिए देखो - यहाँ है brew doctorब्याज का उत्पादन:

Warning: /usr/bin occurs before /usr/local/bin
This means that system-provided programs will be used instead of those
provided by Homebrew. The following tools exist at both paths:

    ctags
    emacs
    emacsclient
    etags
    ex
    git
    git-cvsserver
    git-receive-pack
    git-shell
    git-upload-archive
    git-upload-pack
    rview
    rvim
    view
    vim
    vimdiff
    vimtutor
    xxd

Consider setting your PATH so that /usr/local/bin
occurs before /usr/bin. Here is a one-liner:
    echo export PATH='/usr/local/bin:$PATH' >> ~/.bash_profile

कारण मैं नहीं डालता brewवास्तव में, उपकरण वास्तव में, बिल्कुल नहीं, क्योंकि है brew स्थापित ls तथा tar आदेश फाइल सिस्टम एसीएल को ठीक से संभाल नहीं पाते हैं, वास्तव में, पिछली बार मैंने चेक किया था (जो पिछले सप्ताह था) वे बिल्कुल संभाले नहीं थे। यह एक बड़ी समस्या है, और संबंधित के साथ, इसे पूरी तरह से टालने के लिए man पेज कॉन्फ़िगरेशन समस्या जो सेटिंग के साथ टैग करती है $PATH ठीक है, मैं सुनिश्चित करता हूं कि मैंने रखा है OSX संबंधित उपकरण, विशेष रूप से उन में पाए जाते हैं /bin तथा /usr/bin, प्रथम।

एक और कारण मैं भी नहीं डालता /usr/local/bin मेरे रास्ते में बिल्कुल इसलिए है brew दूसरों के साथ अच्छी तरह से खेल नहीं है, और fink तथा port (मैकपॉर्ट्स) में वर्तमान में अधिक समर्थित पैकेज हैं जिनकी मुझे आवश्यकता है अभी व। उदाहरण के लिए, मैं प्राप्त कर सकता हूँ gnome-terminal साथ में fink, लेकिन यह एक सूत्र बनाने और इसके साथ ऐसा करने का एक बड़ा प्रयास होगा brew। तो, मैं रखता हूँ /sw तथा /opt मेरी खोज में $PATH (के लिये fink तथा port, क्रमशः) और संदर्भ चीजों की मुझे आवश्यकता है /usr/local/bin, समेत gnat, या तो वर्तनी, या मैं उपयोग करते हैं bash  aliasया, मैं स्रोत ए setup जब मैं लिखता हूं तो पूरी तरह से अलग वातावरण के लिए फ़ाइल करें Ada कोड।

बात यह है कि यह वास्तव में उस चीज़ पर निर्भर करता है जो आप चाहते हैं और उस समय की आवश्यकता है।

यहां उल्लिखित एसीएल समस्या का एक उदाहरण दिया गया है।

मानक के साथ OSX उपकरण:

$ /bin/ls -le /var/root | head -7
total 24
drwx------+  3 root  wheel  102 May 28  2013 Desktop
 0: group:everyone deny delete
 1: user:_spotlight inherited allow list,search,readattr,readextattr,readsecurity,file_inherit,directory_inherit
drwx------+  6 root  wheel  204 Sep 19 14:22 Documents
 0: group:everyone deny delete
 1: user:_spotlight inherited allow list,search,readattr,readextattr,readsecurity,file_inherit,directory_inherit

और साथ brew स्थापित उपकरण:

$ /usr/local/bin/gls -le /var/root
/usr/local/bin/gls: invalid option -- 'e'
Try '/usr/local/bin/gls --help' for more information.

तथा

$ /usr/local/bin/gls --help | grep -i acl

आपको इसी तरह के परिणाम मिलेंगे tar और मैं घर को कई अन्य नहीं जानता brew टूल्स, लेकिन एक के कारण सड़क के नीचे 6 महीने का ब्रेक लग सकता है ACL संकट!


5
2018-01-03 22:07



उपयोगी जानकारी के लिए धन्यवाद। एक नोट के रूप में, हालांकि, अभी मेरे सिस्टम पर, मेरे पास दोनों नाम / usr / bin और / usr / local / bin (उदा।, गिट, जो सिमंकिंक है, जैसा कि आप नोट करते हैं) में उसी नाम के साथ निष्पादन योग्य हैं। तो, वे डिफ़ॉल्ट रूप से संघर्ष करते हैं। मैं अपने शैल काम के लिए सिस्टम टूल्स को ओवरराइड करना चाहता हूं। - rholmes


यहाँ बहुत सारे अच्छे जवाब हैं। ये मेरा:

echo >> ~/.bashrc alias my="PATH=/usr/local/bin:$PATH"
. ~/.bashrc
my git --version # Brew's fancy git
git --version # Apple's old crusty git

आपको प्रत्येक प्रोग्राम के लिए एक अलग उपनाम बनाने की बचत करता है, और बोनस के रूप में यह आपको आवश्यकतानुसार डिफ़ॉल्ट इंस्टॉलेशन को सुलभ करता है।

यदि आप ZSH का उपयोग कर रहे हैं तो वही काम करता है; बस बाहर स्विच करें bashrc के लिये zshrc। आप बाहर निकल सकते हैं my के लिये _ या और भी @ टाइपिंग पर सहेजने के लिए।


4
2017-09-18 20:46





पाथ के साथ गड़बड़ करने की बजाय (जो मेरे इतिहास में मुझे महीनों बाद जला दिया जाता है) मैंने अपनी zsh कस्टम उपनाम निर्देशिका (~ / .zshrc / custom / git_alias.zsh) में गिट के लिए उपनाम जोड़ा।

alias git='/usr/local/bin/git'


2
2017-07-30 18:47



मुझे इसके बारे में पता नहीं था ... धन्यवाद! - Meltemi


मैं पर्यावरण चर के रूप में परिवर्तन सीमित करना पसंद करते हैं $PATH वास्तव में परिवर्तन चाहते हैं जो उपयोगकर्ताओं को। इस प्रकार, मैं बस निम्नलिखित को जोड़ता हूं ~/.bashrc:

export PATH="$(brew --prefix)/bin:$PATH"

0
2018-03-21 11:54