Pertanyaan Pengaturan variabel lingkungan di OS X?


Apa cara yang tepat untuk memodifikasi variabel lingkungan seperti PATH di OSX? Saya telah melihat Google sedikit dan menemukan 3 file berbeda untuk diedit:

  • / etc / paths
  • ~ / .profile
  • ~ / .tcshrc

Saya bahkan tidak memiliki beberapa file ini, dan saya cukup yakin itu .tcshrc salah, karena OSX menggunakan bash sekarang. Ada yang tahu di mana variabel-variabel ini, terutama PATH, didefinisikan?

Edit: Saya menjalankan OS X 10.5


773
2017-09-25 20:06


asal


Jawaban:


Bruno tepat di jalurnya. Saya telah melakukan penelitian ekstensif dan jika Anda ingin menetapkan variabel yang tersedia di semua aplikasi GUI, satu-satunya pilihan Anda adalah /etc/launchd.conf

Harap dicatat bahwa environment.plist tidak berfungsi untuk aplikasi yang diluncurkan melalui Spotlight. Ini didokumentasikan oleh Steve Sexton di sini.

1) Buka prompt terminal

2) Ketik sudo vi /etc/launchd.conf (catatan: file ini mungkin belum ada)

3) Masukkan konten seperti berikut ini ke dalam file

# Set environment variables here so they are available globally to all apps
# (and Terminal), including those launched via Spotlight.
#
# After editing this file run the following command from the terminal to update 
# environment variables globally without needing to reboot.
# NOTE: You will still need to restart the relevant application (including 
# Terminal) to pick up the changes!
# grep -E "^setenv" /etc/launchd.conf | xargs -t -L 1 launchctl
#
# See http://www.digitaledgesw.com/node/31
# and http://stackoverflow.com/questions/135688/setting-environment-variables-in-os-x/
#
# Note that you must hardcode the paths below, don't use enviroment variables.
# You also need to surround multiple values in quotes, see MAVEN_OPTS example below.
#
setenv JAVA_VERSION 1.6
setenv JAVA_HOME /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
setenv GROOVY_HOME /Applications/Dev/groovy
setenv GRAILS_HOME /Applications/Dev/grails
setenv NEXUS_HOME /Applications/Dev/nexus/nexus-webapp
setenv JRUBY_HOME /Applications/Dev/jruby

setenv ANT_HOME /Applications/Dev/apache-ant
setenv ANT_OPTS -Xmx512M

setenv MAVEN_OPTS "-Xmx1024M -XX:MaxPermSize=512m"
setenv M2_HOME /Applications/Dev/apache-maven

setenv JMETER_HOME /Applications/Dev/jakarta-jmeter

4) Simpan perubahan Anda di VI dan reboot Mac Anda. Atau gunakan perintah grep / xargs yang ditampilkan dalam komentar kode di atas.

5) Buktikan bahwa variabel Anda bekerja dengan membuka jendela Terminal dan mengetik export dan Anda harus melihat variabel baru Anda. Ini juga akan tersedia di IntelliJ dan aplikasi GUI lainnya yang Anda luncurkan melalui Spotlight.


603
2018-02-25 23:42



Cara mengatur lingkungan untuk proses baru yang dimulai oleh Spotlight (tanpa perlu reboot)

Anda dapat mengatur lingkungan yang digunakan oleh launchd (dan, dengan ekstensi, apa pun mulai dari Spotlight) dengan launchctl setenv. Misalnya untuk mengatur jalur:

launchctl setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

Atau jika Anda ingin mengatur jalur Anda .bashrc atau serupa, kemudian dicerminkan dalam launchd:

PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
launchctl setenv PATH $PATH

Tidak perlu melakukan reboot meskipun Anda perlu me-restart aplikasi jika Anda ingin mengambil lingkungan yang berubah.

Ini termasuk cangkang yang sudah berjalan di bawah Terminal.app, meskipun jika Anda ada di sana, Anda dapat mengatur lingkungan lebih langsung, mis. dengan export PATH=/opt/local/bin:/opt/local/sbin:$PATH untuk bash atau zsh.

Cara menyimpan perubahan setelah reboot

Untuk pertahankan perubahan setelah reboot Anda dapat mengatur variabel lingkungan dari /etc/launchd.conf, seperti:

setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

launchd.conf dijalankan secara otomatis saat Anda reboot.

Jika Anda ingin perubahan ini berlaku sekarang, Anda harus menggunakan perintah ini untuk memproses ulang launchctl.conf (terima kasih @mklement untuk tip!)

egrep -v '^\s*#' /etc/launchd.conf | launchctl

Anda dapat mengetahui lebih lanjut launchctl dan bagaimana itu dimuat launchd.conf dengan perintah man launchctl.


241
2017-09-21 01:23



Hingga dan termasuk Lion (10.7) Anda dapat mengaturnya

~ / .MacOSX / environment.plist

Lihat:

Untuk PATH di Terminal, Anda harus dapat mengaturnya .bash_profile atau .profile (Anda mungkin harus membuatnya meskipun)

Untuk singa gunung dan seterusnya  Anda perlu menggunakan launchd dan launchctl


102
2017-09-25 20:08



Solusi untuk kedua jalur perintah dan aplikasi GUI dari satu sumber (bekerja dengan Yosemite & El Capitan)

Mari kita asumsikan Anda memiliki definisi variabel lingkungan di Anda ~/.bash_profile seperti di cuplikan berikut:

export JAVA_HOME="$(/usr/libexec/java_home -v 1.8)"
export GOPATH="$HOME/go"
export PATH="$PATH:/usr/local/opt/go/libexec/bin:$GOPATH/bin"
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"

Kita butuh sebuah Agen Peluncuran yang akan berjalan pada setiap login dan kapan saja sesuai permintaan yang akan memuat variabel-variabel ini ke sesi pengguna. Kami juga memerlukan skrip shell untuk menguraikan definisi ini dan membuat perintah yang diperlukan untuk dieksekusi oleh agen.

Buat file dengan plist akhiran (mis. diberi nama osx-env-sync.plist) di ~/Library/LaunchAgents/ direktori dengan isi berikut:

<?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>osx-env-sync</string>
  <key>ProgramArguments</key>
  <array>
    <string>bash</string>
    <string>-l</string>
    <string>-c</string>
    <string>
      $HOME/.osx-env-sync.sh
    </string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

-l parameter sangat penting di sini; diperlukan untuk mengeksekusi skrip shell dengan shell login maka ~/.bash_profile bersumber di tempat pertama sebelum skrip ini dijalankan.

Sekarang, skrip shell. Buat di ~/.osx-env-sync.sh dengan isi sebagai berikut:

grep export $HOME/.bash_profile | while IFS=' =' read ignoreexport envvar ignorevalue; do
  launchctl setenv ${envvar} ${!envvar}
done

Pastikan skrip shell dapat dieksekusi:

chmod +x ~/.osx-env-sync.sh

Sekarang, muat agen peluncuran untuk sesi saat ini:

launchctl load ~/Library/LaunchAgents/osx-env-sync.plist

(Re) Luncurkan aplikasi GUI dan verifikasi bahwa ia dapat membaca variabel lingkungan.

Pengaturannya gigih. Ini akan bertahan dengan restart dan relogins.

Setelah pengaturan awal (yang baru saja Anda lakukan), jika Anda ingin mencerminkan perubahan apa pun di Anda ~/.bash_profile ke seluruh lingkungan Anda lagi, jalankan kembali launchctl load ... perintah tidak akan melakukan apa yang Anda inginkan; sebagai gantinya Anda akan mendapatkan peringatan seperti berikut:

<$HOME>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress

Untuk memuat ulang variabel lingkungan Anda tanpa melalui proses keluar / masuk, lakukan hal berikut:

launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist

Terakhir, pastikan Anda meluncurkan kembali aplikasi Anda yang sudah berjalan (termasuk Terminal.app) untuk membuat mereka sadar akan perubahan tersebut.

Saya juga sudah memasukkan kode dan penjelasan di sini ke proyek GitHub: osx-env-sync.

Saya harap ini akan menjadi solusi terakhir, setidaknya untuk versi OS X terbaru (Yosemite & El Capitan).


56
2017-09-04 20:06



1

vim ~/.bash_profile

File mungkin tidak ada (jika tidak, Anda bisa membuatnya).

2. ketik ini dan simpan file:

export PATH=$PATH:YOUR_PATH_HERE

3.run

source ~/.bash_profile

46
2017-11-25 04:29



Pada dasarnya ada dua masalah yang harus diselesaikan ketika berhadapan dengan variabel lingkungan di OS X. Yang pertama adalah ketika menjalankan program dari Spotlight (ikon kaca pembesar di sisi kanan Mac menu / status bar) dan yang kedua ketika menjalankan program dari Dock. Meminjam program dari aplikasi / utilitas Terminal adalah hal yang sepele karena membaca lingkungan dari lokasi shell standar (~/.profile, ~/.bash_profile, ~/.bashrc, dll.)

Ketika memohon program dari Dock, gunakan ~/.MacOSX/environment.plist Dimana <dict> elemen berisi urutan <key>KEY</key><string>theValue</string> elemen.

Saat memohon program dari Spotlight, pastikan bahwa peluncuran telah dilakukan setup dengan semua pengaturan kunci / nilai yang Anda butuhkan.

Untuk menyelesaikan kedua masalah secara bersamaan, saya menggunakan item masuk (diatur melalui Alat Preferensi Sistem) pada akun Pengguna saya. Item login adalah skrip bash itu memanggil fungsi cadel Emacs meskipun tentu saja bisa menggunakan mereka alat scripting favorit untuk mencapai hal yang sama. Pendekatan ini memiliki manfaat tambahan yang bekerja setiap saat dan tidak memerlukan reboot, saya dapat mengedit ~/.profile, jalankan item login di beberapa shell dan ubah tampilannya untuk program yang baru dipanggil, baik dari Dock atau Spotlight.

Detail:

Item masuk: ~/bin/macosx-startup

#!/bin/bash
bash -l -c "/Applications/Emacs.app/Contents/MacOS/Emacs --batch -l ~/lib/emacs/elisp/macosx/environment-support.el -f generate-environment"

Fungsi cadel Emacs: ~/lib/emacs/elisp/macosx/envionment-support.el

;;; Provide support for the environment on Mac OS X

(defun generate-environment ()
  "Dump the current environment into the ~/.MacOSX/environment.plist file."
  ;; The system environment is found in the global variable:
  ;; 'initial-environment' as a list of "KEY=VALUE" pairs.
  (let ((list initial-environment)
        pair start command key value)
    ;; clear out the current environment settings
    (find-file "~/.MacOSX/environment.plist")
    (goto-char (point-min))
    (setq start (search-forward "<dict>\n"))
    (search-forward "</dict>")
    (beginning-of-line)
    (delete-region start (point))
    (while list
      (setq pair (split-string (car list) "=")
            list (cdr list))
      (setq key (nth 0 pair)
            value (nth 1 pair))
      (insert "  <key>" key "</key>\n")
      (insert "  <string>" value "</string>\n")

      ;; Enable this variable in launchd
      (setq command (format "launchctl setenv %s \"%s\"" key value))
      (shell-command command))
    ;; Save the buffer.
    (save-buffer)))

CATATAN: Solusi ini merupakan campuran dari mereka yang datang sebelum saya menambahkan milik saya, terutama yang ditawarkan oleh Matt Curtis, tetapi saya dengan sengaja mencoba untuk mempertahankan ~/.bash_profile platform konten independen dan menempatkan pengaturan launchd lingkungan (fasilitas Mac saja) menjadi skrip terpisah.


33
2018-03-26 20:03



Lain, gratis, opensource, Mac OSX Mountain Lion (10.8) Preferensi pane / solusi environment.plist EnvPane.

EnvPane's Kode sumber tersedia di Github. EnvPane sepertinya memiliki fitur yang sebanding RCEnvironmentNamun, tampaknya itu dapat memperbarui variabel tersimpan secara instan, yaitu tanpa kebutuhan untuk memulai kembali atau login, yang disambut baik.

Seperti yang dinyatakan oleh pengembang:

EnvPane adalah panel preferensi untuk Mac OS X 10.8 (Mountain Lion) itu   memungkinkan Anda mengatur variabel lingkungan untuk semua program di kedua grafis   dan sesi terminal. Tidak hanya memulihkan dukungan untuk   ~ / .MacOSX / environment.plist di Mountain Lion, itu juga menerbitkan Anda   perubahan lingkungan segera, tanpa perlu keluar   dan kembali.
  <SNIP>
  EnvPane termasuk (dan secara otomatis menginstal) a   agen launchd yang berjalan 1) lebih awal setelah login dan 2) kapan saja   ~ / .MacOSX / environment.plist berubah. Agen itu membaca   ~ / .MacOSX / environment.plist dan ekspor variabel lingkungan dari   file itu ke instance launchd pengguna saat ini melalui API yang sama itu   digunakan oleh setenv launchctl dan launchctl unsetenv.

Disclaimer: Saya sama sekali tidak terkait dengan pengembang atau proyeknya.

P.S. Saya suka namanya (terdengar seperti 'Ends Pain').


21
2018-01-15 14:04