Bagaimana Mac OS X menetapkan nilai $ PATH?

11

Saya memiliki pemahaman dasar tentang bagaimana $ PATH dapat diatur, tetapi apakah ada dokumentasi yang sepenuhnya menjelaskan di mana Mac OS mendapatkan semua jalur yang ditambahkan ke $ PATH? Saya mengetahui hal-hal seperti /etc/profile,, /etc/pathsdan /etc/profile.d, tetapi apakah ada skrip lain yang akhirnya mempengaruhi nilai $ PATH? Saya juga tidak begitu akrab antara non-login, dan shell login ( .bashrc, .bash_profile), tapi saya menyadari perbedaan mendasar.

Pukulan psiko
sumber

Jawaban:

9

Biasanya, PATH Anda diatur oleh shell. Untuk Bash, semuanya dijelaskan dalam manual . Anda juga dapat membuka man bashdan melompat ke INVOCATIONbagian tersebut.

Dipanggil sebagai shell login interaktif, atau dengan --login

Ketika Bash dipanggil sebagai shell login interaktif, atau sebagai shell non-interaktif dengan opsi --login, ia pertama kali membaca dan mengeksekusi perintah dari file / etc / profile, jika file itu ada. Setelah membaca file itu, ia mencari ~ / .bash_profile, ~ / .bash_login, dan ~ / .profile, dalam urutan itu, dan membaca serta mengeksekusi perintah dari yang pertama yang ada dan dapat dibaca.

Dipanggil sebagai shell non-login interaktif

Ketika shell interaktif yang bukan shell login dimulai, Bash membaca dan mengeksekusi perintah dari ~ / .bashrc, jika file itu ada. Di OS X, selain itu, ada path_helperyang membaca konten /etc/paths.ddan menambahkannya ke jalur Anda.

Kuncinya di sini adalah bahwa pada OS X, Terminal membuka shell login secara default, sedangkan di Linux, shell biasanya dimulai sebagai shell non-login. Josh Staiger memiliki penjelasan yang bagus tentang shell masuk dan non-login .

Jadi, pada dasarnya hanya ada dua tiga ini di mana Anda dapat menetapkan jalur:

  • /etc/profile(yang memanggil path_helper)
  • /etc/pathsdan /etc/paths.d(dipanggil dari path_helper)
  • file konfigurasi shell Anda ( .bash_profile)
slhck
sumber
Terima kasih atas jawaban singkat dan informatif. Jadi saya kira saya agak mengerti, skrip / artefak mana yang mempengaruhi $ PATH saat itu. Jadi apakah ini berarti /etc/profileskrip ini terutama digunakan oleh bash? Saya tidak memiliki pengalaman dengan cangkang lain, tetapi saya berasumsi mereka mengikuti struktur yang berbeda?
Psycho Punch
The /etc/profiledigunakan oleh sebagian besar (semua? Tidak 100% yakin) kerang. Itu sebabnya itu adalah pilihan yang baik untuk meletakkan segala sesuatu yang Anda inginkan di mana-mana, seperti PATH. Bash membaca .bash_file sementara Zsh misalnya membaca .zshrcselain yang lain. Itu tergantung pada shell.
slhck
"Di OS X, selain itu, ada path_helper yang membaca konten /etc/paths.d dan menambahkannya ke path Anda." Tidak, path_helperini tidak disebut kerang non-login interaktif (atau kerang non-interaktif). Ini sebenarnya disebut shell login interaktif /etc/profile.
Maggyero
8

Path di /etc/pathsdan /etc/paths.d/*biasanya ditambahkan PATHoleh path_helper . path_helperdijalankan dari /etc/profile, jadi dijalankan ketika bash dipanggil sebagai shell login interaktif, tetapi tidak ketika bash dipanggil sebagai shell non-login atau shell non-interaktif.

/etc/pathsberisi /usr/local/bindi akhir secara default, dan /etc/paths.d/kosong secara default.

Terminal dan iTerm 2 membuka shell baru sebagai shell login secara default, dan shell dibuka ketika Anda ssh ke komputer Anda juga merupakan shell login. Banyak emulator terminal pada platform lain tmux,, dan mode shell di Emacs membuka shell baru sebagai shell non-login.

Saya telah menambahkan baris ini ke /etc/launchd.conf:

setenv PATH ~/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/libexec:/usr/texbin

Ini mengubah nilai PATHdari proses root launchd. Nilai ini diwarisi oleh semua proses lainnya, termasuk proses peluncuran per pengguna. Anda dapat menerapkan perubahan /etc/launchd.confdengan memulai ulang, atau dengan menjalankan launchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.confdan meluncurkan kembali proses.

Pada OS X, ~/.profiletidak dibaca ketika Anda masuk secara grafis. Jika keduanya ~/.bash_profiledan ~/.profileada, bash tidak membaca ~/.profile.

~/.MacOSX/environment.plist berhenti bekerja di 10.8.

Lri
sumber