Variabel lingkungan di Mac OS X

186

Pembaruan: Tautan di bawah ini tidak memiliki jawaban lengkap . Harus menetapkan path atau variabel di dua tempat (satu untuk GUI dan satu untuk shell) lumpuh.

Tidak Gandakan : Mengatur variabel lingkungan di OS X?


Berasal dari latar belakang Windows di mana sangat mudah untuk mengatur dan memodifikasi variabel lingkungan (cukup buka System Properties> Advanced> Environment Variables), sepertinya tidak semudah itu di Mac OS 10.5. Sebagian besar referensi mengatakan saya harus memperbarui / etc / profile atau ~ / .profile. Apakah itu setara dengan Variabel Sistem dan Variabel Pengguna? Misalnya, di mana saya harus mengatur JAVA_HOMEvariabel saya ?


EDIT:

Saya ingin dapat mengakses variabel dari terminal serta aplikasi seperti Eclipse. Juga, saya harap saya tidak perlu me-restart / logout untuk membuat ini berlaku.

Abdullah Jibaly
sumber
Dan ada beberapa saran dalam jawaban pertanyaan link di tidak diulang di sini ...
dmckee --- mantan moderator kucing

Jawaban:

142

Tidak perlu duplikasi. Anda dapat mengatur variabel lingkungan yang digunakan oleh launchd (dan proses anak, yaitu apa pun yang Anda mulai dari Spotlight) menggunakanlaunchctl setenv .

Misalnya, jika Anda ingin mencerminkan jalur Anda saat ini di launchd setelah mengaturnya di .bashrcatau di mana pun:

PATH=whatever:you:want
launchctl setenv PATH $PATH

Variabel lingkungan tidak diperbarui secara otomatis dalam menjalankan aplikasi. Anda perlu meluncurkan kembali aplikasi untuk mendapatkan variabel lingkungan yang diperbarui (walaupun Anda hanya dapat mengatur variabel di shell Anda, misalnya PATH=whatever:you:want; tidak perlu meluncurkan kembali terminal).

Matt Curtis
sumber
1
Sepertinya jawaban terbaik sejauh ini, tidak perlu untuk aplikasi pihak ke-3!
Abdullah Jibaly
2
Tampaknya ini bukan global: variabel lingkungan yang disetel seperti ini bersifat lokal bagi pengguna. Kami masih belum memiliki mekanisme global untuk menetapkan variabel lingkungan.
Andrew
@Andrew Apa maksud Anda, lokal untuk pengguna? Saya berharap semua proses selanjutnya mulai dari launchd akan terpengaruh.
Matt Curtis
@MattCurtis: Variabel lingkungan yang diatur melalui launchctl setenvtampaknya hanya dapat dilihat oleh pengguna yang membuat perubahan. Jika saya menetapkan variabel sebagai pengguna biasa, itu tidak terlihat untuk me-root (via sudo) dan sebaliknya.
Andrew
2
@Andrew OK, root memiliki launchd sendiri - ps aux | grep launchdakan menampilkan ini. Periksa juga man sudo, dokumen mana yang sudo(secara default) dengan sengaja mengatur ulang lingkungan - jika Anda sudo -Eakan melestarikan lingkungan (termasuk variabel yang telah Anda tetapkan launchctl setenv). Apakah Anda memiliki aplikasi yang sebenarnya untuk ini? Jika demikian, apakah metode ini bekerja untuk Anda?
Matt Curtis
299

Ada beberapa tempat di mana Anda dapat mengatur variabel lingkungan.

  • ~/.profile: gunakan ini untuk variabel yang ingin Anda atur di semua program yang diluncurkan dari terminal (perhatikan bahwa, tidak seperti di Linux, semua shell dibuka di Terminal.app adalah shell login).
  • ~/.bashrc: ini dipanggil untuk shell yang bukan shell login. Gunakan ini untuk alias dan hal-hal lain yang perlu didefinisikan ulang dalam subkulit, bukan untuk variabel lingkungan yang diwariskan.
  • /etc/profile: ini dimuat sebelum ~ / .profile, tetapi sebaliknya setara. Gunakan ketika Anda ingin variabel diterapkan ke program terminal yang diluncurkan oleh semua pengguna pada mesin (dengan asumsi mereka menggunakan bash).
  • ~/.MacOSX/environment.plist: ini dibaca oleh loginwindow saat masuk. Ini berlaku untuk semua aplikasi, termasuk yang GUI, kecuali yang diluncurkan oleh Spotlight di 10.5 (bukan 10.6). Anda harus keluar dan masuk lagi agar perubahan diterapkan. File ini tidak lagi didukung pada OS X 10.8.
  • launchdcontoh pengguna Anda : ini berlaku untuk semua program yang diluncurkan oleh pengguna, GUI dan CLI. Anda dapat menerapkan perubahan kapan saja dengan menggunakan setenvperintah di launchctl. Secara teori , Anda harus dapat memasukkan setenvperintah ~/.launchd.conf, dan launchdakan membacanya secara otomatis ketika pengguna masuk, tetapi dalam praktiknya dukungan untuk file ini tidak pernah diterapkan. Sebagai gantinya, Anda dapat menggunakan mekanisme lain untuk menjalankan skrip saat masuk, dan meminta skrip itu launchctlmengatur launchdlingkungan.
  • /etc/launchd.conf: ini dibaca oleh launchd ketika sistem dinyalakan dan ketika pengguna masuk. Mereka mempengaruhi setiap proses tunggal pada sistem, karena launchd adalah proses root. Untuk menerapkan perubahan pada menjalankan root launchd Anda dapat menyalurkan perintah ke sudo launchctl.

Hal mendasar yang perlu dipahami adalah:

  • variabel lingkungan diwarisi oleh anak-anak proses pada saat mereka bercabang dua.
  • proses root adalah instance launchd, dan ada juga instance launchd terpisah per sesi pengguna.
  • launchd memungkinkan Anda untuk mengubah variabel lingkungan saat ini menggunakan launchctl; variabel yang diperbarui kemudian diwarisi oleh semua proses baru yang diarungi sejak saat itu.

Contoh pengaturan variabel lingkungan dengan launchd:

echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl

Sekarang, luncurkan aplikasi GUI Anda yang menggunakan variabel, dan voila!

Untuk mengatasi fakta yang ~/.launchd.conftidak berhasil, Anda dapat memasukkan skrip berikut ini ~/Library/LaunchAgents/local.launchd.conf.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>local.launchd.conf</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>launchctl &lt; ~/.launchd.conf</string>    
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Lalu Anda bisa memasukkan ke setenv REPLACE_WITH_VAR REPLACE_WITH_VALUEdalam ~/.launchd.conf, dan itu akan dieksekusi pada setiap login.

Perhatikan bahwa, ketika memiparkan daftar perintah ke launchctl dengan cara ini, Anda tidak akan dapat mengatur variabel lingkungan dengan nilai yang mengandung spasi. Jika Anda perlu untuk melakukannya, Anda dapat menghubungi launchctl sebagai berikut: launchctl setenv MYVARIABLE "QUOTE THE STRING".

Juga, perhatikan bahwa program lain yang berjalan saat login dapat dijalankan sebelum agen peluncuran, dan dengan demikian mungkin tidak melihat variabel lingkungan yang ditetapkannya.

LaC
sumber
3
Sebenarnya, mengenai ~/.MacOSX/environment.plist, tentang Lion saya itu adalah membaca dan digunakan. Baru saja mengujinya. Saya sebenarnya lebih suka daripada .launchd.conf karena saya menggunakan panel preferensi RCenvironment untuk mempertahankannya.
Gilimanjaro
5
Tidak dapat mulai ~/.launchd.confbekerja pada 10.6.8 - sepertinya tidak berpengaruh. Juga halaman manual mengatakan file ini saat ini tidak didukung.
snowcrash09
4
~ / .launchd.conf tampaknya tidak berfungsi pada 10.7.3 dan ketika saya melihat halaman manual dikatakan $ HOME / .launchd.conf File konfigurasi launchd Anda (saat ini tidak didukung)
tidak kreatif
4
Di 10.8 (Mountain Lion), ~ / .MacOSX / environment.plist tidak lagi didukung. Menurut Apple Dev, seseorang harus "Mengubah daftar Info.pl. Dari aplikasi itu sendiri untuk memuat kamus" LSEnvironment "dengan variabel lingkungan yang Anda inginkan." Untuk info lebih lanjut, lihat apple.stackexchange.com/questions/57385/...
pnkfelix
3
@LaC Bagus, posting komprehensif; dapatkah Anda memperbaruinya untuk mencatat bahwa ~/.launchd.confmasih belum didukung dan tidak berfungsi pada OS X 10.8.3? Lihatman launchd.conf
mklement0
12

Saya pikir apa yang dicari OP adalah solusi sederhana, seperti windows.

ini dia:

https://www.macupdate.com/app/mac/14617/rcenvironment

Tom Teman
sumber
1
Wow, ini terlihat keren. belum mencobanya tetapi sepertinya persis apa yang saya butuhkan dari deskripsi.
Abdullah Jibaly
6
btw, tautan aslinya sepertinya sudah rusak sejak saya mempostingnya (ada apa Apple? 301's mahal?). Anda dapat menggunakan tautan ini sebagai gantinya: macupdate.com/app/mac/14617/rcenvironment
Tom Teman
Ini sangat tua. Lihatlah jawaban lain yang menyebutkan osx-env-sync untuk solusi modern yang bekerja bahkan di OS X 10.10 (Yosemite) dan lebih tinggi.
Warren P
1
Harap rangkum informasi dari tautan dalam jawaban Anda. Seperti yang telah kita lihat, tautan rusak karena berbagai alasan.
user3.1415927
7

Anda dapat membaca di linux, yang cukup dekat dengan apa itu Mac OS X. Atau Anda dapat membaca di BSD Unix, yang sedikit lebih dekat. Sebagian besar, perbedaan antara Linux dan BSD tidak banyak berarti.

/etc/profile adalah variabel lingkungan sistem.

~/.profile adalah variabel lingkungan khusus pengguna.

"Di mana saya harus mengatur variabel JAVA_HOME saya?"

  • Apakah Anda memiliki banyak pengguna? Apakah mereka peduli? Apakah Anda akan mengacaukan beberapa pengguna lain dengan mengubah /etc/profile?

Secara umum, saya lebih suka tidak mengacaukan pengaturan seluruh sistem meskipun saya satu-satunya pengguna. Saya lebih suka mengedit pengaturan lokal saya.

S.Lott
sumber
5

Untuk aplikasi GUI, Anda harus membuat dan mengedit ~/.MacOSX/environment.plist. Lebih detail di sini . Anda harus keluar untuk menerapkannya. Saya tidak yakin apakah mereka juga mempengaruhi aplikasi yang diluncurkan dari Terminal, tetapi saya berasumsi mereka akan melakukannya.

Untuk aplikasi yang diluncurkan dari Terminal, Anda juga dapat mengedit file ~ / .profile.

JW.
sumber
2
Ya, Terminal akan mewarisi variabel, seperti apa pun yang diluncurkan dari Terminal. Anda dapat menggunakan panel preferensi RCenvironment untuk mempertahankan variabel.
Gilimanjaro
1
Solusi ini tidak lagi berfungsi dengan beberapa revisi Mac OS X v10.7. Itu tidak dengan revisi Mac OS X v10.8 atau lebih tinggi. Sebagai gantinya, lihat: stackoverflow.com/a/4567308/543738
LS
3

Cukup buka ~/.profilefile, via nanodi Terminal dan ketik di sana:

export PATH=whatever/you/want:$PATH

Simpan file ini (cmd + X dan Y). Setelah itu silakan keluar / masuk lagi atau cukup buka tab baru di Terminal dan coba gunakan variabel baru Anda.

TOLONG JANGAN lupa menambahkan ": $ PATH" setelah apa pun / yang Anda inginkan, jika tidak, Anda akan menghapus semua jalur dalam variabel PATH, yang sudah ada sebelumnya.

Migele
sumber
4
Ini hanya berlaku untuk lingkungan perintah bash. Variabel yang Anda atur di sini tidak terlihat oleh aplikasi GUI.
Warren P
3

Menyinkronkan variabel lingkungan OS X untuk baris perintah dan aplikasi GUI dari satu sumber dengan osx-env-sync .

Saya juga memposting jawaban untuk pertanyaan terkait di sini .

Ersin Er
sumber
Ini fantastis. Saran: Masukkan launchctl unload / launctl muat "refresh now" ke dalam skrip. Saya menyebutnya osx-env-sync-now.sh. Saya memodifikasi .bash_profile dan menjalankan skrip "refresh sekarang" kecil dan lanjutkan. Saya pikir ada implikasi keamanan di sini, jadi saya pikir beberapa batasan harus dibuat. Pasti ada alasan mereka mematikan kemampuan ini di OS X.
Warren P
@WarrenP Selesai! Periksa repo.
Ersin Er
Luar biasa. Ini menyelesaikan banyak rasa sakit bagi saya. Satu kasus di mana ini sangat berguna bagi siapa pun yang mengembangkan dengan SCALA. Mengatur SCALA_HOME untuk scala baris perintah dan scala GUI (seperti di netbeans) adalah hal yang sangat menyakitkan.
Warren P
0

Jika Anda ingin mengubah variabel lingkungan secara permanen di macOS, atur di /etc/paths. Catatan , file ini hanya-baca secara default, jadi Anda harus chmod untuk izin menulis.

IgorGanapolsky
sumber
Ini tidak berhasil untuk saya. Saya punya /usr/bin/localdi file itu, bahkan tanpa memodifikasi file, itu seperti itu secara default, namun aplikasi GUI saya hanya melihat /usr/bin:/bin:/usr/sbin:/sbin. Saya reboot berkali-kali.
mgol
@ m_gol Apa yang Anda dapatkan saat berlari cat /etc/paths/?
IgorGanapolsky
1
/ usr / local / bin, / usr / bin, / bin, / usr / sbin, / sbin, dalam baris terpisah. Namun SourceTree melihat semuanya kecuali yang pertama.
mgol
Anda mungkin ingin mengedit ke "Jika Anda ingin mengubah jalur default di macOS". Ini tidak ada hubungannya dengan masalah variabel lingkungan yang lebih umum.
rfay
0

Untuk pengguna Mac OS X Catalina 2020:

Lupakan jawaban tidak berguna lainnya, di sini hanya diperlukan dua langkah:

  1. Buat file dengan konvensi penamaan: priority-appname. Kemudian salin dan tempel path yang ingin Anda tambahkanPATH .

    Misalnya 80-vscodedengan konten/Applications/Visual Studio Code.app/Contents/Resources/app/bin/ dalam kasus saya.

  2. Pindahkan file itu ke /etc/paths.d/. Jangan lupa untuk membuka tab baru (sesi baru) di Terminal dan ketikecho $PATH untuk memeriksa apakah jalur Anda ditambahkan!

Perhatikan: metode ini hanya menambahkan jalur Anda ke PATH.

Hujan
sumber