Tôi nên đặt biến PATH trên máy Mac của mình như thế nào để tìm thấy các công cụ cài đặt Hombrew?


86

Cố gắng thiết lập Homebrew trên máy Mac mới (trên các máy Mac trước đây tôi sẽ cài đặt các gói từ nguồn).

Gói đầu tiên tôi thử cài đặt là Git:

$ brew install git

Quá trình cài đặt đã ổn, nhưng which gitvẫn hiển thị cái trong /usr/bin/gitđó đi kèm với Lion (tôi nghĩ sao?). Và không phải cái trong /usr/local/bin/gitđó mới được cài đặt.

$ 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

Như bạn có thể thấy /usr/binmặc định trước đó /usr/local/bintrong$PATH

Vì vậy, tôi bối rối! Tôi nghĩ rằng điểm của HomeBrew (và một cái gì đó mà những người sáng tạo dường như khoe khoang) là bạn không cần phải lộn xộn với $PATHbiến!?!

Vì vậy, tôi đã làm gì sai?


bạn đã lộn xộn với con đường của bạn trước đây và có thể đặt chúng theo thứ tự sai? Ngoài ra tôi không chắc tại sao đây là dạng "điểm khoe khoang" homebrew ... nó không giống như khái niệm về một con đường hoặc sửa đổi nó là một điều phức tạp liên quan đến việc soạn thảo và rắc 10 chuỗi khác nhau trên hệ thống của bạn bằng các quyền đặc biệt hoặc một cái gì đó .. ..
prodigitalson

1
đường dẫn, phần không liên quan đến RVM, phải là vấn đề tiêu chuẩn. Và không, tôi không phàn nàn về việc phải thay đổi con đường. Chỉ là họ dường như lặp lại tuyên bố If you choose /usr/local, everything 'just works!'rằng tôi phải tự hỏi tôi đang thiếu gì ... bởi vì nó không "chỉ hoạt động".
Meltemi

Câu trả lời:


78

Tôi tìm thấy bài viết liên quan này là rất hữu ích. Thay vì thay đổi $PATHbiến, bạn chỉ cần chỉnh sửa /etc/pathstệp của mình .

Homebrew muốn tôi sửa đổi ĐƯỜNG của tôi; không biết làm thế nào

Ngay sau khi tôi làm theo hướng dẫn và đặt /usr/local/binở trên /usr/bin, các vấn đề của tôi đã được giải quyết.

  1. Trên OS X, mở Terminal
  2. Nhập lệnh: sudo vi /etc/paths
  3. Nhập mật khẩu của bạn nếu bạn được yêu cầu
  4. Bạn sẽ thấy một danh sách các đường dẫn. Chỉnh sửa chúng để /usr/local/binđường dẫn được nhập vào phía trên /usr/binđường dẫn
  5. *Lưu và thoát
  6. Khởi động lại thiết bị đầu cuối

Đây là những gì của tôi sau khi tôi làm điều đó:

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

* Để lưu và thoát, gõ dấu hai chấm ( :), sau đó nhập wq(để viết và thoát cùng lúc), theo sau Enter.

Bạn cũng có thể mở /etc/pathstệp trong trình soạn thảo văn bản đồ họa và chỉnh sửa theo cách đó.

Tín dụng cho fengd trên tại Stack Overflow cho câu trả lời của mình ở đó.


Đối với vi dimwits (như tôi), sử dụng d để cắt một dòng và p để dán nó khi ở chế độ lệnh
Gerard

10
Tôi sẽ thận trọng với điều này - câu trả lời tốt hơn là chỉ sửa đổi đường dẫn trong .profile / .bash_profile và xuất nó ở đó. Bằng cách thay đổi / etc / path, bạn (có khả năng) ảnh hưởng đến tất cả các quy trình hệ thống; thay đổi PATH trong .profile / .bash_profile bản địa hóa ưu tiên cho cả tài khoản của bạn và các lệnh được gọi thông qua shell lệnh (trong trường hợp của tôi để phát triển, là điều tôi muốn). Nếu bạn thực sự thận trọng, bạn có thể làm những gì @Aristotle Pagaltzis gợi ý trong câu trả lời dưới đây.
chuyến đi

1
Có một số điểm khi bạn dừng lại để xem xét có điều gì đó cực kỳ sai lầm khi cài đặt đơn giản từ trình quản lý gói được thiết kế cho OSX không thành công? Thay đổi đường dẫn của bạn là một "sửa chữa" có khả năng phá vỡ và BTW, lý do tôi vấp phải sửa chữa được đề xuất này là do brew không cập nhật đường dẫn của tôi, nhưng "đường dẫn" đã theo đúng thứ tự. Một ngõ cụt khác. Ngăn chặn sự điên rồ, khắc phục nguyên nhân gốc rễ.
Rick O'Shea

Ngoài ra, có path_helper/etc/paths.d.
Simon Wright

29

Câu trả lời này đã lỗi thời. Thứ PATHtự Homebrew ưa thích được sử dụng như được giải thích, nhưng điều đó không còn đúng nữa. Tuy nhiên, cách tiếp cận thường được áp dụng nhiều hơn, vì vậy vì lợi ích, tôi sẽ từ bỏ nó.


Bạn không nên.

Homebrew cố tình giữ /usr/local/bin sau /usr/bin trong đường dẫn để tương thích tối đa. Đảo ngược thứ tự của các thư mục này PATHbằng cách chỉnh sửa /etc/pathscó nghĩa là tất cả các chương trình ở bất kỳ đâu trên hệ thống, bất kể chúng được khởi động như thế nào, sẽ nhận được phiên bản lệnh Homebrew của lệnh. Nhưng một số người có thể mong đợi phiên bản đặc biệt của Apple hoặc không thể sử dụng phiên bản mới hơn, v.v.

Làm thế nào để duy trì nguyên tắc này mà vẫn có được phiên bản cài đặt Homebrew git? Như đã nói, tất cả các vấn đề có thể được giải quyết bằng một lớp không xác định (ngoại trừ có quá nhiều lớp không xác định). - Hoặc trong trường hợp này, hóa ra là hai lớp.

Cụ thể, đó là một phần trong thói quen Unix của tôi để có một ~/binthư mục mà tôi đặt vào lúc bắt đầu PATH. Đây là một trong những bit đầu tiên trong tôi .bashrc:

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

Điều này kiểm tra xem PATHcó chứa ~/bin, và nếu không, hãy chuẩn bị trước. Với điều đó, sau đó chọn lọc chỉ gitưu tiên quản lý Homebrew so với phiên bản hệ thống (thay vì mọi nhị phân do Homebrew quản lý) và chỉ cho các phiên shell của bạn (thay vì tất cả các chương trình bắt đầu từ mọi nơi, kể cả các chương trình GUI), là đơn giản như symlinking nó:

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

Bạn có thể liên kết /usr/local/Cellar/git/1.8.2.1/bin/gittrực tiếp, nhưng sau đó bạn sẽ phải sửa liên kết tượng trưng của mình mỗi lần bạn thực hiện brew upgrade git(trực tiếp hoặc gián tiếp). Bằng cách liên kết với symlink vị trí cố định của Homebrew, bạn không phải lo lắng về điều đó.

Vì vậy, bạn thêm một thư mục vào $HOMEđể bạn có thể thêm thư mục của mình PATHđể bạn có thể liên kết tượng trưng với liên kết tượng trưng và khắc phục vấn đề của bạn và đặt một nụ cười cho Dr Seuss. Yo dawg Tôi chăn bạn thích symlink vì vậy chúng tôi đặt một đường dẫn vào bạn PATHđể bạn có thể symlink trong khi bạn symlink.


1
Tuyệt vời, câu trả lời này chính xác những gì tôi đã tự hỏi!
N_A

SEEMS này thích câu trả lời đúng, nhưng tôi không thể tìm ra các lệnh chính xác để chạy. Tôi tiếp tục nhận được "Tệp tồn tại" khi tạo liên kết tượng trưng.
Ryan

Không đủ chi tiết để giúp bạn, xin lỗi.
Aristotle Pagaltzis

1
@Ryan đảm bảo bạn có thứ tự args ngay trong lnlệnh. Đường dẫn đầu tiên là mục tiêu và đường dẫn thứ hai là liên kết tượng trưng
Freedom_Ben

1
đúng là, trên el cap, tôi đã thất bại với câu trả lời lỗi thời và đã thành công với (tôi sử dụng ZSH) chỉnh sửa thứ tự của đường dẫn trong .zshrcexport PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
Urs

17

Bạn đã không làm gì sai, nhưng có vẻ như khá rõ ràng rằng nếu bạn gặp khó khăn /usr/local/bintrước khi /usr/binvấn đề cụ thể này biến mất. Cách khắc phục đơn giản nhất là làm điều đó và đặt một cái gì đó như

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

trong ~/.bash_profiletất cả mọi thứ mà Homebrew cài đặt được tìm thấy đầu tiên. Đó là cách mà tôi đã thiết lập trên máy Mac của mình và nó đã hoạt động với tôi từ lâu, tuy nhiên, YMMV.

Có vẻ như họ tin rằng nó sẽ hoạt động /usr/local/binđược sau đó /usr/bin , vì vậy trong khi tôi có thể tự mình làm hỏng $PATH, tôi có thể thấy tài liệu của họ thiếu ở đâu:

Lưu ý rằng bạn nên đặt /usr/local/binsau /usr/bin vì một số chương trình sẽ có phiên bản hệ thống, ví dụ: ruby ​​và phá vỡ nếu chúng có phiên bản Homebrew mới hơn.

Từ sự khác biệt giữa wiki và bác sĩ bia # 10738 . Lưu ý rằng tài liệu này tiếp tục nói, "Các câu hỏi thường gặp (các báo ở trên) đề cập đến PATH thiết cho các ứng dụng GUI; bác sĩ (những lời khuyên để đặt /usr/local/bintrước /usr/bin . Trong PATH của bạn) đề cập đến PATH thiết cho các ứng dụng CLI"


1
Điều này sẽ không để lại hai /usr/local/bins trong tôi $PATH? Tôi cũng tin như thế. Tôi tự hỏi liệu thay vào đó chúng ta nên chỉnh sửa thứ tự của các đường dẫn mặc định trong /etc/pathshoặc nội dung của /etc/paths.d? Nhưng điều này sẽ ảnh hưởng đến mọi người dùng ... có thể không phải là điều xấu. Dù sao, chỉ muốn xem những người khác đã tiếp cận điều này như thế nào.
Meltemi

@Meltemi, tinh thần của câu trả lời này là chính xác: cập nhật PATH(theo cách bạn chọn) để có /usr/local/bintrước /usr/bin. Cá nhân tôi cập nhật của tôi PATHtrong .bash_profilenhư đề xuất ở đây.

@ Nick- thông tin thú vị ... và chỉ phục vụ để gây nhầm lẫn các vấn đề (ít nhất là vấn đề của tôi ) ... Các tài liệu homebrew dường như ngụ ý rằng các lệnh Terminal nên nhận ứng dụng /usr/local/binngay cả khi nó đi /usr/bintheo đường dẫn. Nhưng ứng dụng GUI cần mã hóa đặc biệt? CNTT có vẻ như tất cả các ứng dụng, GUI hoặc không, cần chúng tôi điều chỉnh biến $ PATH. Vì vậy, tôi (hoặc những người sáng tạo Homebrew) đang thiếu gì?
Meltemi

Tôi nghĩ Homebrew giả định rằng bạn muốn sử dụng Apple thực thi trước tiên - git là một thay đổi vì cho đến khi Lion không được Apple cung cấp, do đó Homebrew cần nó - bây giờ bạn có thể sử dụng Apple,
user151019

Tôi đồng ý với Mark về điều này. Với MacPorts và Fink, giả định là cung cấp một môi trường hoàn toàn nguyên sơ, tách biệt với mọi thứ mà Apple cung cấp ngoài hộp. Homebrew đã đưa ra lập trường rằng công cụ của Apple là tuyệt vời và không nên tránh sử dụng nó (tại sao tải xuống một phiên bản gcc khác khi Apple có thể sẽ làm gì?).
Nick Klauer

6

Tôi không đồng ý với câu trả lời của jthomas. Chỉnh sửa tệp / etc / path của bạn sẽ thay đổi đường dẫn tải cho tất cả các chương trình. Điều này có thể nguy hiểm nếu một ứng dụng hệ thống đang mong đợi tìm thấy một phiên bản nhị phân cụ thể nhưng tìm thấy một phiên bản khác vì bạn đã chỉnh sửa tệp đường dẫn của mình. Thay vào đó, thay đổi biến đường dẫn của bạn trong ~ / .bashrc (hoặc ~ / .bash_profile). Sau đó, đường dẫn tải của bạn sẽ chỉ thay đổi bên trong thiết bị đầu cuối:

# Thêm ứng dụng homebrew vào PATH
xuất PATH = / path / to / homebrew / app / bin: $ PATH

Sau đó tải lại bash hoặc source ~/.bashrc, và bạn tốt để đi. Vì đường dẫn homebrew xuất hiện trước bất kỳ thứ gì khác, bash sẽ tải phiên bản mà bạn đã tải xuống với homebrew.


Trong OS X, .bashrckhông được tải theo mặc định. Bạn có tự tìm nguồn không?
slhck

Ồ, vâng. Tôi đến từ OS X từ Ubuntu và đã quen với việc .bashrctôi lấy nó từ .bash_profile. Nếu bạn không muốn tạo tệp RC, bạn có thể thêm lệnh vào .bash_profile.
Nathan

5

Theo tôi hiểu, brewkhông đặt bất cứ thứ gì vào /usr/local/bincác va chạm đó (có cùng tên với) một tệp thực thi được phân phối của Apple. Do đó, có /usr/local/bintrong đường dẫn trước /bin/usr/binkhông nên là một vấn đề, bởi vì không nên có sự va chạm tên. * Tuy nhiên, hãy xem các vấn đề với lstar, và sử dụng các trình tổng hợp gói khác như finkport(MacPorts), theo cách bên dưới.

Brew thực hiện một trong hai điều mà tôi biết có thể giúp quản lý va chạm tên:

  1. Brewlá kegs không liên kết trong hầm. Để cài đặt công cụ, brew để lại các công cụ ở đó và tạo các liên kết tượng trưng đến các công cụ đó /usr/local/bin. Đối với các công cụ brewkhông muốn xung đột tên, nó không tạo ra một liên kết tượng trưng.
  2. Đối với nhiều người nếu không phải tất cả các công cụ tiêu chuẩn cũng có trong /bin/usr/bin, brewtiền tố liên kết /usr/local/binvới một "g", ví dụ, để thực hiện lsvới một phiên bản bia, hãy sử dụng gls. Đơn giản chỉ cần làm một ls -ltrong /usr/local/binvà tìm kiếm các tập tin liên quan - đó là những người brewđặt ở đó. Lưu ý: Các brewcông cụ được cài đặt phải được truy cập bằng tên thật của chúng được tìm thấy trong /usr/local/Cellar/coreutils/8.21/libexec/gnubin.

Tôi không đặt /usr/local/bincon đường của mình vì hai lý do - những lý do đó nằm ở cuối câu trả lời của tôi.

Để đánh giá các xung đột tên trong hệ thống của bạn, hãy sử dụng brew doctorvà tìm phần này - Đây là kết brew doctorquả quan tâm của:

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

Lý do tôi không đặt brewcông cụ lên hàng đầu, trên thực tế, hoàn toàn không phải là vì các lệnh brewđã cài đặt lstarkhông xử lý đúng hệ thống tệp ACL, trên thực tế, lần trước tôi đã kiểm tra (đó là tuần trước), chúng không phải là ' t xử lý cả . Đây là một vấn đề LỚN và để tránh nó hoàn toàn, cùng với manvấn đề cấu hình trang được liên kết mà các thẻ cùng với việc đặt $PATHquyền, tôi đảm bảo rằng tôi đặt các OSXcông cụ liên quan, đặc biệt là các công cụ được tìm thấy trong /bin/usr/bintrước tiên.

Một lý do khác mà tôi thậm chí không đặt /usr/local/binvào con đường của mình là vì brewkhông chơi tốt với người khác finkport(MacPorts) có nhiều gói được hỗ trợ hơn hiện tại mà tôi cần NGAY BÂY GIỜ . Ví dụ, tôi có thể nhận được gnome-terminalvới fink, nhưng nó sẽ là một nỗ lực lớn để xây dựng một công thức và làm tương tự với brew. Vì vậy, tôi giữ /sw/opttrong tìm kiếm của mình $PATH(cho finkport, tương ứng) và tham khảo những thứ tôi cần /usr/local/bin, bao gồm gnat, được đánh vần hoặc tôi sử dụng bash aliashoặc tôi lấy một setuptệp cho một môi trường hoàn toàn khác khi tôi viết Adamã.

Điều này là, nó thực sự phụ thuộc vào những gì bạn muốn và cần tại thời điểm đó.

Đây là một ví dụ về vấn đề ACL mà tôi đã đề cập ở trên.

Với các OSXcông cụ tiêu chuẩn :

$ /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

và với các brewcông cụ được cài đặt:

$ /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

Bạn sẽ nhận được kết quả tương tự tarvà tôi không biết về nhà nhiều brewcông cụ khác , nhưng ai đủ khả năng để có thứ gì đó bị hỏng trong 6 tháng vì một ACLvấn đề!


Cảm ơn vì thông tin hữu ích. Tuy nhiên, như một lưu ý, trên hệ thống của tôi, tôi có các tệp thực thi có cùng tên trong cả / usr / bin và / usr / local / bin (ví dụ: git, được liên kết với IS, như bạn lưu ý). Vì vậy, họ làm xung đột theo mặc định. Tôi cũng muốn ghi đè các công cụ hệ thống cho công việc shell của tôi.
chuyến đi

4

Có rất nhiều câu trả lời hay ở đây. Đây là của tôi:

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

Tiết kiệm cho bạn phải tạo một bí danh riêng cho mỗi chương trình và như một phần thưởng, nó để lại các cài đặt mặc định có thể truy cập được trong trường hợp bạn cần chúng.

Hoạt động tương tự nếu bạn đang sử dụng ZSH; chỉ cần chuyển ra bashrccho zshrc. Bạn có thể chuyển ra mycho _hoặc thậm chí @để tiết kiệm gõ.


2

Thay vì gây rối với PATH (mà trong lịch sử của tôi sẽ quay lại đốt cháy tôi vài tháng sau đó), tôi đã thêm một bí danh cho git trong thư mục bí danh tùy chỉnh zsh của tôi (~ / .zshrc / custom / git_alias.zsh).

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


0

Tôi thích giới hạn các thay đổi đối với các biến môi trường như $PATHngười dùng thực sự muốn thay đổi. Vì vậy, tôi chỉ cần thêm vào như sau ~/.bashrc:

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

0

Bạn có thể đưa ra lệnh sau trong một thiết bị đầu cuối, nó sẽ thêm thư mục brew home + the / bin trong PATH của bất kỳ tệp init "RC" nào của bạn (bash, zsh, csh)

echo "export PATH="'$PATH:$(brew --prefix)/bin' >> ~/.$(basename $SHELL)rc

Thưởng thức !

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.