سؤال كيف يمكنني تعيين متغير PATH على جهاز Mac الخاص بي حتى يتم العثور على أدوات Hombrew المثبتة؟


في محاولة لإعداد البيرة على جهاز Mac جديد (على أجهزة Mac السابقة كنت أقوم بتثبيت الحزم من المصدر).

كانت الحزمة الأولى التي حاولت تثبيتها هي Git:

$ 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

لذلك ، أنا مرتبك! اعتقدت نقطة البيرة (شيء يبدو أن المبدعين يتفاخرون به) هو أنك لست مضطرًا للتعبث مع $PATH متغير!؟!

لذا ، ماذا أفعل الخطأ؟


79
2017-08-17 19:36


الأصل


هل الفوضى مع المسار الخاص بك سابقا وربما وضعها في الترتيب الخطأ؟ أيضا لست متأكدا لماذا هذا هو "المنزل التفاخر" شكل المنزل ... انها ليست مثل مفهوم مسار أو تعديله هو شيء معقد يتضمن التأليف ورش 10 من مختلف القوائم في النظام الخاص بك مع أذونات خاصة أو شيء من هذا .. .. - prodigitalson
يجب أن يكون المسار ، وهو الجزء الذي لا يرتبط بـ RVM ، مشكلة قياسية. لا ، أنا لا أشكو من الحاجة لتغيير المسار. يبدو أنهم يكررون المطالبة If you choose /usr/local, everything 'just works!' أن أتساءل عما أنا مفقود ... لأنه لا "يعمل فقط". - Meltemi


الأجوبة:


لقد وجدت هذه المشاركة ذات الصلة لتكون مفيدة للغاية. بدلا من تغيير $PATH المتغير ، فقد قمت ببساطة بتحرير الخاص بك /etc/paths ملف.

يريدني البيرة أن يعدل PATH. لا فكرة كيف

بمجرد اتباع التوجيهات ووضعها /usr/local/bin في الاعلى /usr/bin، تم حل مشكلاتي.

  1. على OS X ، افتح Terminal
  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 في Stack Overflow لإجابته هناك.


73
2018-01-13 22:35



لفي dimwits (مثلي) استخدم د لقطع خط و p للصقه في وضع الأوامر - Gerard
سأكون حذرا مع هذا - الجواب الأفضل هو مجرد تعديل المسار في .profile / .bash_profile وتصديرها هناك. عن طريق تغيير / etc / paths ، أنت (يحتمل) تؤثر على جميع عمليات النظام ؛ يؤدي تغيير PATH في .profile / .bash_profile إلى تفضيل التفضيل لكل من حسابك وتلك الأوامر التي يتم استدعاؤها عبر shell command (الذي ، في حالتي التطوير ، هو ما أريده). إذا كنت حذرًا حقًا ، فيمكنك فعل ما يقترحهAristotle Pagaltzis في الإجابة أدناه. - rholmes
هل هناك نقطة ما عندما تتوقف عن التفكير في شيء خاطئ بشكل مؤكد أن تثبيت بسيط من مدير الحزم المصمم لـ OSX يفشل في الخروج من الصندوق؟ تغيير المسار الخاص بك هو "إصلاح" محتمل و BTW ، والسبب الذي تعثرت فيه على هذا الإصلاح المقترح هو أن هذا الشراب يفشل في تحديث المسار الخاص بي ، ولكن أيضًا "المسارات" هي بالفعل في الترتيب الصحيح. طريق مسدود آخر. أوقف الجنون ، أصلح السبب الرئيسي. - Rick O'Shea
أيضا ، هناك path_helper و /etc/paths.d. - Simon Wright


هذه الإجابة عفا عليها الزمن. المفضل homebrew PATH كان يتم استخدام الطلب كما هو موضح ، ولكن هذا لم يعد صحيحًا. ومع ذلك ، فإن النهج قابل للتطبيق بشكل عام ، لذا بالنسبة إلى الفائدة ، أترك الأمر.


لا يجب عليك

البيرة يحتفظ عمدا /usr/local/bin  بعد  /usr/bin في الطريق لتحقيق أقصى قدر من التوافق. عكس ترتيب هذه الدلائل في PATH عن طريق التحرير /etc/paths يعني ذلك الكل البرامج في أي مكان على النظام ، بغض النظر عن كيفية تشغيلها ، ستحصل على إصدار Homebrew من الأمر. ولكن قد يتوقع البعض على وجه التحديد إصدار Apple ، أو لن يكونوا قادرين على استخدام إصدار أحدث ، إلخ.

كيف نحافظ على هذا المبدأ ومازلنا نحصل على النسخة المثبتة من Homebrew git؟ كما يقول المثل ، يمكن حل جميع المشاكل مع طبقة من indirection (باستثناء وجود الكثير من طبقات من indirection). - أو في هذه الحالة ، كما اتضح ، طبقتين.

على وجه التحديد ، لقد كان جزءًا من عادات يونكس الخاصة بي ~/bin الدليل الذي وضعت في بداية بلدي PATH. هذا هو واحد من أول البتات في بلدي .bashrc:

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

هذا يتحقق سواء PATH يحتوي على ~/bin، وإذا لم يكن كذلك ، فيجب إضافته. مع ذلك في المكان ، ثم بشكل انتقائي جعل فقط تديرها Homebrew git تأخذ الأسبقية على إصدار النظام (بدلا من كل الثنائية التي تديرها عائلة) ، وفقط لجلسات صدفة الخاص بك (بدلا من الكل البرامج التي تبدأ من أي مكان ، بما في ذلك برامج GUI) ، بسيطة مثل ترميزها:

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

أنت استطاع الارتباط الرمزي /usr/local/Cellar/git/1.8.2.1/bin/git مباشرة ، ولكن بعد ذلك يجب عليك إصلاح الارتباط الرمزي في كل مرة تفعل فيها brew upgrade git (بطريقة مباشرة او بطريقة غير مباشرة). من خلال الارتباط برمز الارتباط الثابت لموقع Homebrew ، لا داعي للقلق بشأنه.

لذلك قمت بإضافة دليل إلى الخاص بك $HOME حتى يمكنك إضافته PATH بحيث يمكنك الارتباط إلى ارتباط رمزي ، والذي يعمل على حل مشكلتك ويضع ابتسامة على الدكتور سوس. أنا دوغ أنا قطيع كنت مثل symlinks حتى نضع مسار في حياتك PATH حتى يمكنك الارتباط أثناء الارتباط.


28
2018-04-09 23:28



ممتاز ، هذا بالضبط ما كنت أتساءل! - mydogisbox
هذا يبدو وكأنه الإجابة الصحيحة ، لكنني لا أستطيع معرفة الأوامر الصحيحة للتشغيل. أستمر في الحصول على "الملف موجود" عند إنشاء symlinks. - Ryan
لا توجد تفاصيل كافية لمساعدتك ، آسف. - Aristotle Pagaltzis
Ryan تأكد من حصولك على ترتيب args الحق في 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 لذلك تم العثور على كل شيء يثبته Homebrew أولاً. هذه هي الطريقة التي أعددتها على جهاز Mac الخاص بي ، وقد عملت معي طوال هذا الوقت ، YMMV.

يبدو أنهم يعتقدون أنها ستعمل مع /usr/local/bin يجرى بعد  /usr/bin، لذلك ربما كنت قد قمت بالتخلص من بلدي $PATH، أستطيع أن أرى حيث تفتقر وثائقهم:

لاحظ أنه يجب عليك وضع /usr/local/bin بعد /usr/bin   لأن بعض البرامج تتوقع الحصول على إصدار النظام من ،   على سبيل المثال ، روبي ، وكسر إذا حصلوا على إصدار Homebrew الجديد.

من عند التناقض بين wiki وطبيب الشراب # 10738. لاحظ أن هذا المستند يذهب إلى القول ، "الأسئلة الشائعة (الاقتباس أعلاه) تشير إلى إعداد PATH لتطبيقات واجهة المستخدم الرسومية؛ الطبيب (النصيحة لوضع /usr/local/bin في المقدمة /usr/bin في PATH) يشير إلى إعداد PATH لتطبيقات CLI. "


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 كما هو مقترح هنا.
@ معلومات نيك مثيرة للاهتمام ... ويعمل فقط على إرباك الأمور (على الأقل لي المسائل) ... يبدو أن مستندات Homebrew تعني أن أوامر Terminal يجب أن تلتقط التطبيقات في /usr/local/binعلى الرغم من أنها مسارات /usr/bin في الطريق. لكن تطبيقات واجهة المستخدم الرسومية تحتاج إلى تدليل خاص؟ سوف يبدو الكل تحتاج التطبيقات ، واجهة المستخدم الرسومية أو لا ، إلى ضبط متغير PATH $. إذاً ، ما الذي أفتقده أنا (أو المبدعين من موقع البيرة؟) - Meltemi
أعتقد أن Homebrew يفترض أنك تريد استخدام Apple القابل للتنفيذ أولاً - إن git هو تغيير حتى أنه لم يتم توفيره من قبل شركة Apple لذا فإن شركة Homebrew احتاجته - يمكنك الآن استخدام Apple ، - Mark
أتفق مع مارك على هذا. مع MacPorts و Fink ، كان الافتراض هو توفير بيئة منفصلة تمامًا وبصريًا عن أي شيء تم توفيره من Apple خارج العلبة. اتخذ "هومبرو" موقفًا مفاده أن مادة "أبل" رائعة ولا يجب تجنب استخدامها (لماذا تقوم بتنزيل نسخة أخرى من دول مجلس التعاون الخليجي عندما تقوم شركة أبل بالقيام بذلك على الأرجح؟). - Nick Klauer


أنا لا أتفق مع إجابة جثوماس. سيؤدي تعديل ملف / etc / paths إلى تغيير مسارات التحميل لجميع البرامج. قد يكون هذا خطيرًا إذا كان أحد تطبيقات النظام يتوقع العثور على إصدار محدد من ملف ثنائي ولكنه يبحث عن إصدار مختلف لأنك قمت بتحرير ملف المسارات الخاص بك. بدلاً من ذلك ، قم بتغيير متغير المسار الخاص بك في ~ / .bashrc (أو ~ / .bash_profile). ثم سوف يتغير مسار التحميل الخاص بك فقط داخل المحطة:

# إضافة تطبيق البيرة إلى PATH
  تصدير PATH = / المسار / إلى / homebrew / app / bin: $ PATH

ثم أعد تحميل باش أو source ~/.bashrc، وأنت على ما يرام. نظرًا لأن مسار البيرة الرئيسية يأتي قبل أي شيء آخر ، فستقوم Bash بتحميل الإصدار الذي قمت بتنزيله مع homebrew.


6
2018-04-03 19:28



في OS X ، و .bashrc لا يتم تحميلها افتراضيًا. هل المصدر يدويا؟ - slhck
آه أجل. جئت من نظام التشغيل العاشر من أوبونتو وكان يستخدم للحصول على .bashrc لذلك أنا مصدره من وجهة نظري .bash_profile. إذا كنت لا تريد إنشاء ملف rc ، يمكنك إضافة الأمر إلى الخاص بك .bash_profile. - Nathan


كما أفهمها، brew لا تضع أي شيء فيها /usr/local/bin الذي يتصادم (له نفس اسم) توزيع Apple قابل للتنفيذ. لذلك ، وجود /usr/local/bin في الطريق من قبل /bin و /usr/bin لا يجب أن تكون مشكلة ، لأنه يجب ألا يكون هناك تضارب في الأسماء. * ومع ذلك ، راجع القضايا مع ls و tar، واستخدام مجمعات حزم أخرى مثل fink و port (MacPorts) ، الطريق أدناه.

Brew هل أحد شيئين أعرفهما يساعدان في إدارة تضارب الأسماء:

  1. Brew يترك براميل غير مرتبطة في القبو.لتثبيت الأشياء ، يترك الشراب الأدوات في مكانها ، ويخلق روابط رمزية لتلك الأدوات في /usr/local/bin. للأدوات التي brew لا تريد تصادمًا مع اسم ، فهي لا تنشئ رابطًا رمزيًا.
  2. بالنسبة للعديد إن لم يكن كل الأدوات القياسية الموجودة أيضًا /bin و /usr/bin، brew البادئة الرابط في /usr/local/bin مع "g" ، على سبيل المثال ، لأداء 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 الأوامر لا تتعامل مع ACL بنظام الملفات بشكل صحيح ، في الواقع ، آخر مرة قمت فيها بالتحقق (وهو الأسبوع الماضي) ، لم يتم التعامل معهم على الإطلاق. هذه مشكلة كبيرة ، وتجنبها تمامًا ، إلى جانب المقترنة بها man مشكلة تكوين الصفحة التي علامات جنبا إلى جنب مع ضبط $PATH صحيح ، أنا أتأكد من أنني وضعت OSX الأدوات ذات الصلة ، وخاصة تلك الموجودة في /bin و /usr/bin، أول.

سبب آخر أنني لا أضع حتى /usr/local/bin في طريقي على الإطلاق لأنه brew لا يلعب بشكل جيد مع الآخرين ، و fink و port (MacPorts) لديها المزيد من الحزم المدعومة في الوقت الحاضر التي أحتاج إليها الآن. على سبيل المثال ، يمكنني الحصول عليها gnome-terminal مع finkولكن سيكون جهدًا كبيرًا لبناء صيغة وفعل نفس الشيء مع brew. لذلك ، أظل /sw و /opt في بحثي $PATH (إلى عن على fink و portعلى التوالي) والأشياء المرجعية التي أحتاج إليها من /usr/local/bin، بما فيها gnat، سواء وردت ، أو أنا استخدم bash  aliasأو مصدر أنا setup ملف لبيئة مختلفة تماما عندما أكتب Ada الشفرة.

الشيء هو ، الأمر يعتمد على ما تريد وتحتاجه في ذلك الوقت.

إليك مثال لمشكلة ACL التي ذكرتها أعلاه.

مع المعيار 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 (على سبيل المثال ، git ، والتي ترتبط بـ IS ، كما تلاحظ). لذلك ، فإنهم يتعارضون بشكل افتراضي. أنا أيضا لا تريد تجاوز أدوات النظام لأعمال شل بلدي. - 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





بدلا من العبث مع PATH على الإطلاق (الذي في بلدي يعود إلى حرق لي أشهر في وقت لاحق) أضفت اسم مستعار ل git في دليل الأسماء المستعارة مخصص zsh الخاص بي (~ / .zshrc / custom / git_alias.zsh).

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


2
2017-07-30 18:47



لم أكن على علم بذلك ... شكرا! - Meltemi


أنا أفضل الحد من التغييرات على المتغيرات environvent مثل $PATH للمستخدمين الذين يريدون التغيير بالفعل. وهكذا ، أنا ببساطة إضافة ما يلي ~/.bashrc:

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

0
2018-03-21 11:54