Bagaimana cara saya mengatur variabel PATH pada Mac saya sehingga alat yang diinstal Hombrew ditemukan?

86

Mencoba mengatur Homebrew pada Mac baru (pada Mac sebelumnya saya akan menginstal paket dari sumber).

Paket pertama yang saya coba instal adalah Git:

$ brew install git

Instalasi berjalan OK, tapi which gitmasih menunjukkan yang di /usr/bin/gitdalamnya datang bersama Lion (saya pikir?). Dan bukan yang ada di /usr/local/bin/gitdalamnya yang baru saja diinstal.

$ 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

Seperti yang Anda lihat /usr/bindefault sebelumnya /usr/local/bindi$PATH

Jadi saya bingung! Saya pikir inti dari HomeBrew (dan sesuatu yang tampaknya dibanggakan pencipta) adalah bahwa Anda tidak perlu mengacaukan $PATHvariabel!?!

Jadi, apa yang saya lakukan salah?

Meltemi
sumber
apakah Anda mengacaukan jalan Anda sebelumnya dan mungkin menempatkannya di urutan yang salah? Saya juga tidak yakin mengapa ini adalah "bragging point" dari homebrew ... tidak seperti konsep path atau memodifikasi itu adalah hal yang kompleks yang melibatkan pembuatan dan percikan 10 plist yang berbeda di seluruh sistem Anda dengan izin khusus atau sesuatu .. ..
prodigitalson
1
path, baik bagian yang tidak terkait RVM, harus menjadi masalah standar. Dan tidak, saya tidak mengeluh karena harus mengubah jalan. Hanya saja mereka sepertinya mengulangi klaim If you choose /usr/local, everything 'just works!'bahwa saya harus bertanya-tanya apa yang saya lewatkan ... karena itu tidak "hanya bekerja".
Meltemi

Jawaban:

78

Saya menemukan posting terkait ini sangat membantu. Alih-alih mengubah $PATHvariabel, itu hanya Anda mengedit /etc/pathsfile Anda .

Homebrew ingin saya mengubah PATH saya; tidak tahu bagaimana

Segera setelah saya mengikuti petunjuk dan meletakkan di /usr/local/binatas /usr/bin, masalah saya diselesaikan.

  1. Pada OS X, buka Terminal
  2. Ketikkan perintah: sudo vi /etc/paths
  3. Masukkan kata sandi Anda jika diminta
  4. Anda akan melihat daftar jalur. Edit mereka sehingga /usr/local/binjalan dimasukkan di atas /usr/binjalan
  5. *Simpan dan keluar
  6. Mulai ulang Terminal

Inilah yang menjadi milik saya setelah saya melakukan itu:

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

* Untuk menyimpan dan keluar, ketik titik dua ( :), lalu ketik wq(untuk menulis dan keluar pada saat yang sama), diikuti oleh Enter.

Anda juga dapat membuka /etc/pathsfile dalam editor teks grafis dan mengeditnya seperti itu.

Penghargaan untuk mendapatkan di Stack Overflow untuk jawabannya di sana.

jthomas
sumber
Untuk vi dimwits (seperti saya) gunakan d untuk memotong garis dan p untuk menempelkannya ketika dalam mode perintah
Gerard
10
Saya akan menggunakan hati-hati dengan ini - jawaban yang lebih baik adalah dengan hanya mengubah jalur di .profile / .bash_profile dan ekspor di sana. Dengan mengubah / etc / paths, Anda (berpotensi) mempengaruhi semua proses sistem; mengubah PATH di .profile / .bash_profile melokalisasi preferensi untuk akun Anda dan perintah-perintah yang dipanggil melalui shell perintah (yang, dalam kasus saya untuk pengembangan, adalah apa yang saya inginkan). Jika Anda benar-benar berhati-hati, Anda dapat melakukan apa yang disarankan @Aristotle Pagaltzis dalam jawaban di bawah ini.
rholmes
1
Apakah ada titik ketika Anda berhenti untuk mempertimbangkan ada sesuatu yang sangat salah bahwa instalasi sederhana dari manajer paket yang dirancang untuk OSX gagal out-of-the-box? Mengubah jalur Anda berpotensi melanggar "perbaikan" dan BTW, alasan saya menemukan perbaikan yang diusulkan adalah bahwa minuman gagal untuk memperbarui jalur saya, juga, tetapi "jalur" sudah dalam urutan yang benar. Jalan buntu yang lain. Hentikan kegilaan, perbaiki akar masalahnya.
Rick O'Shea
Juga, ada path_helperdan /etc/paths.d.
Simon Wright
29

Jawaban ini sudah usang. PATHPemesanan Homebrew yang disukai dulu seperti yang dijelaskan, tetapi itu tidak lagi benar. Namun, pendekatan ini lebih umum berlaku, jadi demi kepentingan, saya meninggalkannya.


Anda seharusnya tidak.

Homebrew sengaja terus /usr/local/bin setelah /usr/bin di jalur untuk kompatibilitas maksimum. Membalik urutan direktori ini PATHdengan mengedit /etc/pathsakan berarti bahwa semua program di mana saja pada sistem, tidak peduli bagaimana mereka dimulai, akan mendapatkan versi Homebrew dari sebuah perintah. Tetapi beberapa mungkin secara khusus mengharapkan versi Apple, atau tidak dapat menggunakan versi yang lebih baru, dll.

Bagaimana cara mempertahankan prinsip ini dan masih mendapatkan versi Homebrew yang diinstal git? Seperti kata pepatah, semua masalah dapat diselesaikan dengan lapisan tipuan (kecuali memiliki terlalu banyak lapisan tipuan). - Atau dalam kasus ini, ternyata, dua lapisan.

Secara khusus, sudah menjadi bagian dari kebiasaan Unix saya untuk memiliki ~/bindirektori yang saya letakkan di awal PATH. Ini adalah salah satu bit pertama di .bashrc:

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

Ini memeriksa apakah PATHberisi ~/bin, dan jika tidak, menambahkannya. Dengan itu, maka selektiflah yang menjadikan Homebrew yang gitlebih diutamakan daripada versi sistem (bukan setiap biner yang dikelola oleh Homebrew), dan hanya untuk sesi shell Anda (alih-alih semua program dimulai dari mana saja, termasuk program GUI), adalah sesederhana menghubungkannya:

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

Anda dapat symlink /usr/local/Cellar/git/1.8.2.1/bin/gitsecara langsung, tetapi kemudian Anda harus memperbaiki symlink Anda setiap kali Anda melakukan brew upgrade git(secara langsung atau tidak langsung). Dengan menghubungkan ke symlink lokasi tetap Homebrew, Anda tidak perlu khawatir tentang hal itu.

Jadi Anda menambahkan direktori ke Anda $HOMEsehingga Anda dapat menambahkannya PATHsehingga Anda dapat symlink ke symlink, dan itu memperbaiki masalah Anda dan membuat Dr. Seuss tersenyum. Yo dawg Saya kawan Anda suka symlink jadi kami letakkan path di Anda PATHsehingga Anda dapat symlink saat Anda symlink.

Aristoteles Pagaltzis
sumber
1
Luar biasa, ini menjawab apa yang saya ingin tahu!
N_A
TAMPAKNYA ini seperti jawaban yang benar, tetapi saya tidak dapat menemukan perintah yang tepat untuk dijalankan. Saya terus mendapatkan "File ada" saat membuat symlink.
Ryan
Tidak cukup detail untuk membantu Anda, maaf.
Aristoteles Pagaltzis
1
@Ryan pastikan Anda memiliki urutan args tepat di lnperintah. Jalur pertama adalah target, dan yang kedua adalah symlink
Freedom_Ben
1
benar bahwa, pada el cap, saya gagal dengan jawaban yang usang dan berhasil (saya menggunakan ZSH) mengedit urutan jalan di .zshrcexport PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
Urs
17

Anda tidak melakukan kesalahan apa pun, tetapi tampaknya cukup jelas bahwa jika Anda berada /usr/local/bindi jalur Anda sebelum /usr/binmasalah khusus ini hilang. Perbaikan termudah adalah dengan melakukan hal itu dan meletakkan sesuatu seperti

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

dalam ~/.bash_profilesegala sesuatu yang Anda menginstal Homebrew ditemukan terlebih dahulu. Begitulah cara saya mengaturnya di Mac saya, dan itu telah bekerja untuk saya selama ini, bagaimanapun, YMMV.

Itu tidak muncul bahwa mereka percaya itu akan bekerja dengan /usr/local/binmenjadi setelah /usr/bin , maka sementara saya mungkin telah mucked saya sendiri $PATH, saya bisa melihat keberadaan dokumentasi mereka kekurangan:

Perhatikan bahwa Anda harus menggunakan /usr/local/binsetelah /usr/bin karena beberapa program akan mengharapkan untuk mendapatkan versi sistem, misalnya, ruby, dan istirahat jika mereka mendapatkan versi Homebrew yang lebih baru.

Dari Perbedaan antara wiki & pembuat bir # 10738 . Perhatikan bahwa dokumen ini selanjutnya mengatakan, "FAQ (kutipan di atas) mengacu pada pengaturan PATH untuk aplikasi GUI; dokter (saran untuk menempatkan di /usr/local/bindepan /usr/bin dalam PATH Anda) mengacu pada pengaturan PATH untuk aplikasi CLI."

Nick Klauer
sumber
1
Apakah ini tidak akan meninggalkan dua /usr/local/bindi saya $PATH? Saya percaya begitu. Saya ingin tahu apakah kita seharusnya mengedit urutan jalur default /etc/pathsatau konten /etc/paths.d? Tapi ini akan mempengaruhi setiap pengguna ... mungkin bukan hal yang buruk. Lagi pula, hanya ingin melihat bagaimana orang lain mendekati ini.
Meltemi
@Meltemi, semangat jawaban ini benar: memperbarui PATH(dengan cara yang Anda pilih) untuk memiliki /usr/local/binmendahului /usr/bin. Saya pribadi memperbarui saya PATHdi .bash_profileseperti yang disarankan di sini.
@ Nick- informasi menarik ... dan hanya berfungsi untuk membingungkan hal-hal (setidaknya masalah saya ) ... Dokumen homebrew tampaknya menyiratkan bahwa perintah Terminal harus mengambil aplikasi /usr/local/binmeskipun ia tertinggal /usr/bindi jalur. Tetapi aplikasi GUI perlu pembuatan kode khusus? Tampaknya semua aplikasi, GUI atau tidak, perlu kita sesuaikan variabel $ PATH. Jadi, apa yang saya (atau pencipta Homebrew) hilang?
Meltemi
Saya pikir Homebrew menganggap Anda ingin menggunakan executable yang disediakan Apple terlebih dahulu - git adalah perubahan karena sampai Lion tidak dipasok oleh Apple sehingga Homebrew membutuhkannya - sekarang Anda dapat menggunakan Apple,
user151019
Saya setuju dengan Markus tentang ini. Dengan MacPorts dan Fink, asumsinya adalah untuk menyediakan lingkungan yang benar-benar murni dan terpisah dari apa pun yang disediakan Apple. Homebrew mengambil sikap bahwa barang-barang Apple bagus dan tidak menghindari menggunakannya (mengapa mengunduh versi gcc yang lain ketika barang Apple kemungkinan besar akan melakukannya?).
Nick Klauer
6

Saya tidak setuju dengan jawaban jthomas. Mengedit file / etc / paths Anda akan mengubah path load untuk semua program. Ini bisa berbahaya jika aplikasi sistem mengharapkan untuk menemukan versi biner tertentu tetapi menemukan versi yang berbeda karena Anda telah mengedit file path Anda. Sebagai gantinya, ubah variabel jalur Anda di ~ / .bashrc (atau ~ / .bash_profile). Maka jalur muat Anda hanya akan berubah di dalam terminal:

# Tambahkan aplikasi homebrew ke PATH
export PATH = / path / ke / homebrew / app / bin: $ PATH

Kemudian muat ulang bash atau source ~/.bashrc, dan Anda siap berangkat. Karena jalur homebrew hadir sebelum yang lain, bash akan memuat versi yang Anda unduh dengan homebrew.

Nathan
sumber
Di OS X, .bashrctidak dimuat secara default. Apakah Anda sumber secara manual?
slhck
Oh ya. Saya berasal dari OS X dari Ubuntu dan terbiasa memiliki .bashrcjadi saya sumber dari saya .bash_profile. Jika Anda tidak ingin membuat file rc, Anda dapat menambahkan perintah ke .bash_profile.
Nathan
5

Seperti yang saya pahami, brewtidak ada /usr/local/binyang bertabrakan (memiliki nama yang sama) dengan Apple yang dapat dieksekusi. Oleh karena itu, memiliki /usr/local/bindi jalur sebelumnya /bindan /usr/bintidak boleh menjadi masalah, karena seharusnya tidak ada tabrakan nama. * Namun, lihat masalah dengan lsdan tar, dan menggunakan agregator paket lain seperti finkdan port(MacPorts), jalan di bawah ini.

Brew apakah salah satu dari dua hal yang saya tahu tentang hal itu membantu mengelola benturan nama:

  1. Brewmeninggalkan tong yang tidak terhubung di Gudang. Untuk menginstal barang, brew meninggalkan alat di tempatnya, dan membuat tautan simbolis ke alat tersebut di /usr/local/bin. Untuk alat yang brewtidak ingin tabrakan nama, itu tidak membuat tautan simbolis.
  2. Bagi banyak orang, jika tidak semua alat standar yang ada di /bindan /usr/bin, brewawalan tautan /usr/local/bindengan "g", jadi misalnya, untuk melakukan lsversi pembuatan, gunakan gls. Cukup lakukan ls -lin /usr/local/bindan cari file yang tertaut - itu adalah yang brewdiletakkan di sana. Catatan: Alat yang brewdiinstal yang harus diakses dengan nama aslinya ada di /usr/local/Cellar/coreutils/8.21/libexec/gnubin.

Saya tidak menempatkan /usr/local/binjalan saya karena dua alasan - alasan itu ada di bawah jawaban saya.

Untuk menilai tabrakan nama di sistem Anda, gunakan brew doctordan cari bagian ini - Inilah brew doctorkeluaran yang menarik:

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

Alasan saya tidak meletakkan brewalat terlebih dahulu, pada kenyataannya, tidak sama sekali, adalah karena brewdiinstal lsdan tarperintah tidak menangani sistem file ACL dengan benar, pada kenyataannya, terakhir kali saya memeriksa (yang minggu lalu), mereka tidak tidak ditangani sama sekali . Ini adalah masalah BESAR, dan untuk menghindarinya bersama-sama, bersama dengan manmasalah konfigurasi halaman terkait yang menandai bersama dengan pengaturan yang $PATHtepat, saya memastikan saya meletakkan OSXalat terkait, terutama yang ditemukan di /bindan /usr/bin, pertama.

Alasan lain saya bahkan tidak menempatkan /usr/local/binjalan saya sama sekali adalah karena brewtidak bermain baik dengan orang lain, dan finkdan port(MacPorts) memiliki cara paket yang lebih didukung saat ini yang saya butuhkan SEKARANG . Misalnya, saya bisa mendapatkan gnome-terminaldengan fink, tetapi itu akan menjadi usaha besar untuk membangun rumus dan melakukan hal yang sama dengan brew. Jadi, saya menyimpan /swdan /optdalam pencarian saya $PATH(untuk finkdan port, masing-masing) dan referensi hal-hal yang saya butuhkan dari /usr/local/bin, termasuk gnat, baik dijabarkan, atau saya gunakan bash alias, atau saya sumber setupfile untuk lingkungan yang sama sekali berbeda ketika saya menulis Adakode.

Masalahnya, itu benar-benar tergantung pada apa yang Anda inginkan dan butuhkan saat itu.

Berikut adalah contoh masalah ACL yang saya sebutkan di atas.

Dengan OSXalat standar :

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

dan dengan brewalat yang diinstal:

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

dan

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

Anda akan mendapatkan hasil yang sama dengan tardan saya tidak tahu banyak brewalat lain di rumah , tetapi siapa yang mampu memiliki sesuatu istirahat 6 bulan di jalan karena ACLmasalah!

Billy McCloskey
sumber
Terima kasih atas info bermanfaatnya. Sebagai catatan, bagaimanapun, pada sistem saya sekarang, saya memiliki executable dengan nama yang sama di / usr / bin dan / usr / local / bin (misalnya, git, yang IS simetris, seperti yang Anda catat). Jadi, mereka melakukan konflik secara default. Saya juga ingin mengganti alat sistem untuk pekerjaan shell saya.
rholmes
4

Ada banyak jawaban bagus di sini. Ini milik saya:

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

Menghemat Anda harus membuat alias terpisah untuk setiap program, dan sebagai bonus itu membuat instalasi default dapat diakses jika Anda membutuhkannya.

Bekerja sama saja jika Anda menggunakan ZSH; hanya beralih bashrcuntuk zshrc. Anda dapat beralih keluar myuntuk _atau bahkan @untuk menghemat mengetik.

Cheezmeister
sumber
2

Daripada bermain-main dengan PATH sama sekali (yang dalam sejarah saya kembali untuk membakar saya berbulan-bulan kemudian) saya menambahkan alias untuk git di direktori alias kustom zsh saya (~ / .zshrc / custom / git_alias.zsh).

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

Jesse Smith
sumber
0

Saya lebih suka membatasi perubahan ke variabel lingkungan seperti $PATHuntuk pengguna yang benar-benar menginginkan perubahan. Jadi, saya cukup menambahkan yang berikut ini ke ~/.bashrc:

export PATH="$(brew --prefix)/bin:$PATH"
Nils Werner
sumber
0

Anda dapat mengeluarkan perintah berikut di terminal, itu akan menambahkan direktori home brew + bin di PATH file init SHELL "rc" Anda apa pun (bash, zsh, csh)

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

Nikmati !

vincedgy
sumber