$ PATH membuatku gila

10

OK, maaf kalau ini sesuatu yang bodoh, tapi saya kehabisan ide.

Tujuan: tambahkan /usr/local/binke$PATH

Masalah: $PATH tidak akan melakukan apa yang saya inginkan atau harapkan

Bagaimana saya sampai di sini: Saya ingin mulai belajar memprogram, jadi saya merasa nyaman bermain-main di bawah tenda, tetapi tidak memiliki banyak pengalaman. Saya menginstal fishshell (karena bersahabat!) Menggunakan homebrewdan mengaturnya sebagai shell default saya (di bawah system prefs>users & groups>advanced). Pada titik tertentu, saya berlari brew doctoruntuk melihat apakah instal saya semuanya halal, dan itu menyarankan saya pindah /usr/local/binke depan $PATHsehingga saya bisa menggunakan instalasi saya gitdaripada salinan sistem. Baik - tetapi di antara path_helperdan fish, ada sesuatu yang terjadi di $PATHluar kendali saya, dan saya tidak pernah bisa mengatur jalur yang benar.

Lingkungan: OSX 10.8.2, upgrade dari 10.7ish, dengan xcodedan devtools diinstal, ditambah x11, homebrewdanfish

Info lebih lanjut: Aku telah menetapkan saya pengguna shell default kembali ke bash, dan mencoba berbagai kerang melalui terminal.app- bash, fish, sh. Saya pindah /usr/local/binke atas /etc/pathstetapi tidak mengubah apa pun. Saya melihat melalui berbagai config.fishfile dan berkomentar hal-hal yang mungkin mengacaukan $ PATH, tidak membantu. Saya memiliki file-file berikut di /etc/paths.d/:

./10-homebrew mengandung /usr/local/bin

./20-fish mengandung /usr/local/Cellar/fish/1.23.1/bin

./40-XQuartz mengandung /opt/X11/bin

Saya menambahkan set +xke saya profiledan ketika saya mulai terminal.appsaya mendapatkan:

Last login: Mon Oct  1 13:31:06 on ttys000
+ '[' -x /usr/libexec/path_helper ']'
+ eval '/usr/libexec/path_helper -s'
++ /usr/libexec/path_helper -s PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/Cellar/fish/1.23.1/bin:/opt/X11/bin";
export PATH;
+ '[' /bin/bash '!=' no ']'
+ '[' -r /etc/bashrc ']'
+ . /etc/bashrc
++ '[' -z '\s-\v\$ ' ']'
++ PS1='\h:\W \u\$ '
++ shopt -s checkwinsize
++ '[' Apple_Terminal == Apple_Terminal ']'
++ '[' -z '' ']'
++ PROMPT_COMMAND='update_terminal_cwd; '
++ update_terminal_cwd
++ local 'SEARCH= '
++ local REPLACE=%20
++ local PWD_URL=file://Chriss-iMac.local/Users/c4
++ printf '\e]7;%s\a' file://Chriss-iMac.local/Users/c4 
Chriss-iMac:~ c4$

Jadi sepertinya path_helper berjalan, tetapi kemudian menjalankan echo $PATHsaya /usr/bin:/bin:/usr/sbin:/sbin. Jadi, sepertinya path_helpertidak melakukan apa yang seharusnya lagi?

Saya yakin ada beberapa perilaku yang didefinisikan dengan baik di sini yang saya tidak mengerti, atau saya borked sesuatu ketika mencoba memperbaikinya. Tolong bantu!

Chris4d
sumber
perhatikan, saya bisa membuatnya bekerja fishdengan membuat ~/.config/fish/config.fishdengan set PATH /usr/local/bin $PATHtetapi saya masih memiliki masalah yang path_helpertampaknya tidak berfungsi seperti seharusnya, dan $PATHdengan demikian menjadi tidak lengkap. Juga masih ada masalah berbeda $PATHuntuk skrip, aplikasi dimulai dari GUI, dll.
Chris4d

Jawaban:

5

larutan:

pilih jika Anda ingin pengaturan sistem atau konfigurasi pengguna dan edit file konfigurasi yang sesuai, jangan gunakan path_helper dengan fish.

lebih

fish tidak sumber / etc / profile, untuk sistem dan konfigurasi pengguna akan membaca masing-masing /etc/fish/config.fish dan ~ / .config / fish / config.fish [1].

path_helper dimaksudkan untuk digunakan untuk shell yang mencari file profil lebar sistem (sh, csh dan turunannya). Karena 10.7 path_helper tampaknya menghormati ketertiban di / etc / paths, AFAIR tidak dalam 10.6 dan itu lebih sulit untuk diatasi.

Jika Anda benar-benar ingin menggunakan path_helper dengan ikan, Anda harus mengurai hasilnya karena hanya akan memberikan sintaks sh dan csh dengan opsi -s dan -c .

Sesuatu seperti

/usr/libexec/path_helper -c | sed -e 's/setenv/set -x/' -e 's/:/ /g' -e 's/[";]//g'

harus melakukan pekerjaan:

[1] http://ridiculousfish.com/shell/user_doc/html/index.html#initialization

anddam
sumber
Bagus! Inilah yang saya miliki sekarang: if status --is-login eval (/usr/libexec/path_helper -c | sed -e 's/setenv/set -x/' -e 's/:/ /g' -e 's/[";]//g') end- berfungsi dengan baik di sini dengan ikan 2 dan Mac OS 10.8.3
topskip
3

Saya sama sekali tidak tahu tentang /etc/paths.d, path_helper, & c., Yang semuanya tampak seperti komplikasi yang berlebihan bagi saya, tetapi yang berikut di akhir ~ / .bashrc Anda seharusnya benar:

 PATH=/usr/local/bin:$PATH

Semoga ini membantu!

Aaron Miller
sumber
Terima kasih Aaron - path_helperadalah utilitas khusus OSX yang seharusnya ditetapkan $PATHsaat masuk dengan membaca dari /etc/pathsdan kemudian /etc/paths.d/*. Ngomong-ngomong, saya mengerti saran Anda harus membenahi saya bash, tetapi saya benar-benar ingin itu bekerja fish(dan secara konsisten di seluruh sistem, jika itu tidak terlalu banyak yang diharapkan).
Chris4d
Ah - maaf soal itu. Saya bukan X pengguna OS sendiri, kasihan lebih, tetapi dari sedikit Google-bashing tampak seolah-olah ini pertanyaan Stack Overflow mungkin lebih seperti apa yang Anda setelah - yang mengatakan, sekali lagi, saya bukan Pengguna OS X sendiri, dan hanya merespons karena melihat (baca: ceroboh) yang cepat pada pertanyaan Anda membuat saya berpikir Anda hanya tertarik pada bash, jadi ikuti saran saya di sini dengan beberapa butir garam. Semoga ini bisa membantu, semua sama -
Aaron Miller
3

Terima kasih kepada Aaron untuk merespons dan untuk semua yang menjawab pertanyaan serupa lainnya di situs stackexchange. Demi anak cucu, inilah yang saya tahu:

  1. path_helperdipanggil dari /etc/profile, oleh sintaks eval '/usr/libexec/path_helper -s'(di mana apostrof sebenarnya adalah backticks). Seperti boneka, saya tidak tahu bagaimana backtick bekerja, dan telah mengubah mereka menjadi tanda kutip untuk beberapa alasan. Ini mematahkan saya profiledari memuat path_helper. Mengganti back-ticks dan sekarang berfungsi seperti seharusnya (tentu saja).
  2. menggunakan set PATH /usr/local/bin $PATHdi saya ~/.config/fish/profile.fishmemastikan bahwa saya mendapatkan urutan yang tepat di shell pilihan saya, tetapi selama path_helperberfungsi mungkin berlebihan.
  3. Untuk memastikan bahwa kelengkapan $PATHtersebut tersedia untuk skrip, aplikasi GUI, dll., Tampaknya merupakan undian antara launchd.confdan environment.plist... masih meneliti yang itu.
Chris4d
sumber
1
Saya membaca beberapa hari yang lalu (tapi saya tidak ingat sumbernya) bahwa 10.8 tidak lagi menawarkan cara yang pasti untuk mendapatkan jalur yang terlihat oleh semua aplikasi. Saya ingat khususnya lingkungan itu. Daftar tidak lagi dibaca; Saya samar-samar menyadari launchd.conf, jadi itu mungkin berhasil, tapi saya pikir artikel itu menyarankan tidak.
echristopherson
1
lebih banyak tindak lanjut: sepertinya path_helper tidak berfungsi sama sekali pada ikan; ini menghasilkan sintaks csh atau bash, yang keduanya tidak kompatibel. Sebagai gantinya, Anda dapat menggunakan ~ / .config / fish / config.fish (skrip startup ikan) ke cat /etc/paths.d/* dan menambahkannya ke $ PATH. Semoga itu bisa membantu seseorang!
Chris4d
apakah Anda bahkan membaca jawaban saya? sudah ada sejak empat bulan sebelum tindak lanjut Anda
anddam