Встановлення змінних середовища в OS X


849

Який правильний спосіб змінити змінні середовища як PATH в OS X?

Я трохи подивився в Google і знайшов три різні файли для редагування:

  • / тощо / шляхи
  • ~ / .профіль
  • ~ / .tcshrc

Я навіть не маю деяких з цих файлів, і я майже впевнений, що .tcshrc помиляється, оскільки OS X зараз використовує bash. Де визначені ці змінні, особливо PATH?

Я працюю OS X v10.5 (Leopard).


env "switch.1.disabled=true" open -n /Applications/Eclipse.app/запустити додаток GUI з новим набором системного середовища.
Гонг

Дивіться також: stackoverflow.com/questions/25385934 / ...
ThomasR

Відповіді:


652

Бруно прямо на шляху. Я провів широкі дослідження, і якщо ви хочете встановити змінні, які доступні у всіх додатках графічного інтерфейсу, ваш єдиний варіант /etc/launchd.conf.

Зверніть увагу, що Environment.plist не працює для програм, запущених через Spotlight. Це задокументовано Стівом Секстоном тут .

  1. Відкрийте підказку терміналу

  2. Введіть sudo vi /etc/launchd.conf(примітка: цей файл ще не існує)

  3. Вмістіть у файл такий вміст, як наступний

    # 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 environment 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. Збережіть зміни in vi та перезавантажте свій Mac. Або скористайтеся командою grep/, xargsяка показана в коментарі до коду вище.

  5. Доведіть, що ваші змінні працюють, відкривши вікно терміналу та ввівши, exportі вам слід побачити нові змінні. Вони також будуть доступні в IntelliJ IDEA та інших програмах GUI, які ви запускаєте за допомогою Spotlight.


3
Я кажу, що прийнята відповідь (environment.plist) не була успішною для мене. Я успішно використовував підхід startd.conf 10.5 та 10.6 на чотирьох машинах.
Меттью Маккаллоу

54
Чи є спосіб зробити це без робити перезавантаження системи ?
sorin

40
Згадане вище обмеження стосується MacOS X 10.5. Однак MacOS X 10.6 вже не має цього обмеження, і встановлення значень у середовищі.plist працює добре навіть для програм, запущених за допомогою прожектора. Тож обрана відповідь правильна для Snow Leopard ;-)
Луї Жакомет

5
Налаштування launchd.confє одним із способів, але потребує перезавантаження (для перезапуску запуску). Якщо ви хочете уникнути перезавантаження, дивіться мою відповідь stackoverflow.com/questions/135688/…
Метт Кертіс,

23
У представленого стартового підходу є кілька проблем. Більшість специфічних для змінної середовища PATH, але запитувач конкретно згадував PATH. 1) елементи в launchd.conf не застосовуються в інтерактивних оболонках, таких як ssh в системі. 2) що має рядок "setenv PATH / testdir", додається до PATH у Terminal.app, але видуває всі інші елементи PATH у середовищі додатків OS X. 3) Виконання "setenv PATH $ {PATH}: / testdir" у /etc/launchd.conf не належним чином розширює існуючий $ PATH 4) startd.conf стосується всіх користувачів, а не лише одного. Не те, щоб у мене був кращий солн.
NoahR

257

Як налаштувати середовище для нових процесів, запущених Spotlight (не потребуючи перезавантаження)

Ви можете встановити середовище, яке використовує запуск (і, розширення, все, що починається з Spotlight) за допомогою launchctl setenv. Наприклад, щоб встановити шлях:

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

Або якщо ви хочете налаштувати свій шлях у .bashrcподібний або подібний, попросіть його відобразити при запуску:

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

Не потрібно перезавантажувати, хоча вам потрібно буде перезапустити додаток, якщо ви хочете, щоб він зміг змінити середовище.

Сюди входять будь-які оболонки, вже запущені під Terminal.app, хоча якщо ви там, ви можете встановити навколишнє середовище безпосередньо, наприклад, export PATH=/opt/local/bin:/opt/local/sbin:$PATHдля bash або zsh.

Як зберегти зміни після перезавантаження

Щоб зберегти зміни після перезавантаження, ви можете встановити змінні середовища /etc/launchd.conf, наприклад:

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

launchd.conf виконується автоматично при перезавантаженні.

Якщо ви хочете, щоб ці зміни набрали чинності зараз, вам слід скористатися цією командою для повторної launchctl.confобробки (дякую @mklement за підказку!)

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

Ви можете дізнатися більше про launchctlте, як він завантажується launchd.confкомандою man launchctl.


2
Дуже приємний! Перевагою використання середовища.plist, однак, здається, є те, що OS X шанує вміст цих файлів без клопоту спочатку запускати термінал. У будь-якому випадку, я думаю, що ваша відповідь в основному була зосереджена на тому, щоб уникнути необхідності перезавантаження, так що це для цього.
fotNelton

2
@kapuzineralex Так, це дозволяє уникнути перезавантаження, а також змінює середовище для програм, запущених із Spotlight, що environment.plistне робить.
Метт Кертіс

2
Налаштування середовища таким чином працювало для мене лише до моменту перезавантаження. Змінна середовища не тривала після того, як я перезавантажив mac. Відповідь Метью відмінно працювала на мене.
Shamal Karunarathne

8
@Shamal: Я поставив +1 вашому коментарю, але майте на увазі, що відповідь Метью вимагає перезавантаження, тоді як я вказую правильний спосіб змінити його без перезавантаження. Якщо ви хочете і те, і інше, я пропоную вам поставити свої налаштування шляху у launchd.conf (щоб вони зберігалися через перезавантаження), а потім використати сценарій із чимось подібним до цього "source /etc/launchctl.conf; launchctl setenv PATH $ PATH", так ви також можете "оновити", коли не хочете перезавантажуватися.
Метт Кертіс

5
@MattCurtis Чи можете ви відредагувати свою відповідь безпосередньо, щоб зрозуміти, що хоча перезавантаження не потрібно, зміни будуть фактично втрачені після перезавантаження? Крім того , правильний спосіб застосувати зміни etc/launchd.confперед тим, як перезавантаження буде використовувати підхід @ відповідь MatthewMcCullough в: egrep "^setenv\ " /etc/launchd.conf | xargs -t -L 1 launchctl.
mklement0

106

До і включаючи OS X v10.7 (Lion) ви можете встановити їх у:

~/.MacOSX/environment.plist

Подивитися:

Для PATH в Терміналі ви повинні мати можливість встановити .bash_profileабо .profile(можливо, вам доведеться створити його)

Для OS X v10.8 (Mountain Lion) і далі вам потрібно використовувати launchdіlaunchctl .


4
Це лише в тому випадку, якщо ви насправді очікуєте, що їх використовуватимуть графічні програми. Оскільки вони зазвичай не використовують змінні середовища, їх не дуже вдале місце.
Кріс Гансон,

18
Є кілька дуже хороших прикладів графічних додатків, які використовують змінні середовища. Наприклад, IntelliJ любить бачити M2_HOME, щоб знати, де живе Мейвен. Щоб відобразити змінну, потрібно встановити її в /etc/launchd.conf замість Environment.plist.
Меттью Маккаллоу

3
Для довідки: використання preferences.plistв OS X 10.5 було менш ніж ідеальним, оскільки на той час preferences.plistне читали програм, запущених через прожектор, дивіться коментар Луї до відповіді Метью та email.esm.psu.edu/pipermail/macosx-emacs/2010-May /002113.html . Для OS X 10.6 environment.plistпрацює як слід.
Янус

16
Це більше не стосується OSX 10.8 apple.stackexchange.com/questions/57385/…
thatsmydoing

1
@tim_yates Чи можете ви відредагувати перший рядок вашої відповіді, щоб прочитати "До і включаючи Лева (10. * 7 *)", враховуючи, що це правильно? Я спробував внести цю редакцію до оригінальної, неоднозначної "До гірського лева", і рецензенти підкорили її.
mklement0

67

Рішення як для командного рядка, так і для програм GUI з одного джерела (працює з Mac OS X v10.10 (Yosemite) та Mac OS X v10.11 (El Capitan))

Припустимо, у вашому ~/.bash_profileподібному фрагменті є визначення змінних оточуючих :

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"

Нам потрібен агент запуску, який запускатиметься при кожному вході та в будь-який час на вимогу, який завантажує ці змінні в сеанс користувача. Також нам знадобиться скрипт оболонки для розбору цих визначень та створення необхідних команд для виконання агентом.

Створіть у каталозі файл із plistсуфіксом (наприклад, названим osx-env-sync.plist) ~/Library/LaunchAgents/із наступним вмістом:

<?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параметр тут критичний; це необхідно для виконання сценарію оболонки з оболонкою для входу, щоб~/.bash_profile в першу чергу було поставлено перед виконанням цього сценарію.

Тепер сценарій оболонки. Створіть його за ~/.osx-env-sync.shдопомогою наступного вмісту:

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

Переконайтеся, що сценарій оболонки виконується:

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

Тепер завантажте запуск агента для поточного сеансу:

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

(Re) Запустіть програму GUI та переконайтеся, що він може читати змінні середовища.

Установка зберігається. Він переживе перезавантаження та релогіни.

Після початкового налаштування (що ви тільки що зробили), якщо ви хочете знову відобразити будь-які зміни у вашому ~/.bash_profileсередовищі, повторна launchctl load ...команда не виконає те, що ви хочете; натомість ви отримаєте попередження на зразок наступного:

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

Щоб перезапустити змінні середовища, не проходячи процес виходу / входу, виконайте наступне:

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

Нарешті переконайтеся, що ви перезапустили вже запущені програми (включаючи Terminal.app), щоб повідомити про зміни.

Тут же я підштовхнув код і пояснення до проекту GitHub: osx-env-sync .

Я сподіваюся, що це стане остаточним рішенням, принаймні для останніх версій OS X (Yosemite & El Capitan).


Працює чудово. Трохи переживає, чи стане це популярним, якщо це буде лазівка ​​безпеки
Warren P

3
Це рішення було єдиним, кого я міг прийти до роботи належним чином. Чудові рішення. Я не можу зрозуміти, чому це повинно бути настільки важким для Mac ...
JohnyTex

2
На жаль, це не працює на El Capitan. Ваш коментар від github.com/ersiner/osx-env-sync/isissue/1#issuecomment-169803508 добре пояснює проблему.
мгдол

1
Отже, це рішення не працює, /etc/launchd.conf не має ефекту, Node.js встановлює свій двійковий файл до / usr / local / bin, і цей шлях не знаходиться в PATH для GUI-додатків. Тому гачки Git, що використовують Node, взагалі не працюють у додатках GUI Git, як SourceTree, в El Capitan. Це жахливо.
мгмоль

1
Проблема полягає лише в змінній PATH. Я сподіваюся, що ми скоро знайдемо рішення.
Ерсін Ер

54
  1. Зробіть:

    vim ~/.bash_profile

    Файл може не існувати (якщо ні, ви можете просто створити його).

  2. Введіть це і збережіть файл:

    export PATH=$PATH:YOUR_PATH_HERE
  3. Біжи

    source ~/.bash_profile

+1 export- це те, що я збирався запропонувати, оскільки BASH не підтримуєsetenv
vol7ron

Працює наразі. Вся ця річ виглядає набагато складніше, ніж я думав. На все це доведеться приділити ще трохи часу. Дякую.
Ruto Collins

34

По суті, є дві проблеми, які потрібно вирішити при роботі зі змінними середовища в OS X. Перша - при запуску програм із Spotlight (піктограма лупи в правій частині меню Mac / панелі стану), а друга - при виклику програм із док-станції . Виклик програми з термінального додатки / утиліти тривіально , оскільки вона зчитує середовища від розташування стандартної оболонки ( ~/.profile, ~/.bash_profile,~/.bashrc і т.д.)

Викликаючи програми з Dock, використовуйте, ~/.MacOSX/environment.plist де <dict>елемент містить послідовність <key>KEY</key><string>theValue</string> елементів.

Коли ви викликаєте програми з Spotlight, переконайтеся, що запуск встановлений з усіма необхідними налаштуваннями ключа / значення.

Щоб вирішити обидві проблеми одночасно, я використовую елемент входу (встановлений через інструмент Налаштування системи) у своєму обліковому записі користувача. Елемент входу - це сценарій bash, який викликає функцію lisp Emacs, хоча, звичайно, можна використовувати їх улюблений інструмент сценаріїв, щоб досягти того ж самого. Цей підхід має додаткову перевагу, що він працює в будь-який час і не потребує перезавантаження, тобто можна редагувати~/.profile , запускати елемент входу в якусь оболонку і мати зміни, видимі для новозапущених програм, або з Dock або Spotlight.

Деталі:

Елемент входу: ~/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"

Функція lisp 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)))

ПРИМІТКА. Це рішення є об'єднанням тих, хто прийшов до того, як я додав шахту, зокрема, запропоновану Меттом Кертісом, але я навмисно намагався зберегти свою ~/.bash_profileплатформу контенту незалежною і перенести налаштування launchdсередовища (лише для Mac) в окремий сценарій .


20
Ого. Я не кажу, що це не спрацює, але ... Я просто вражений складністю, необхідною для отримання послідовного середовища в OS X.
offby1

2
Це найкраще з усіх рішень, які я бачив за 10.9. Єдиний недолік полягає в тому, що, оскільки елементи входу запускаються у невизначеному порядку, якщо Emacs (наприклад) запускається при вході (наприклад, він був відкритий під час виходу), він не обов'язково повинен мати змінні середовища, якщо ви не перезапустите його , тому що він запущений до того, як ваш сценарій.
телоторцій

22

Інше, безкоштовне, відкрите джерело, налаштування Mac OS X v10.8 (Mountain Lion) / область.plist - EnvPane .

Вихідний код EnvPane доступний на GitHub . EnvPane схоже, що він має порівнянні функції з RCEnvironment , однак, здається, він може оновлювати збережені змінні миттєво, тобто без необхідності перезавантаження або входу, що вітається.

Як заявив розробник:

EnvPane - це панель уподобань для Mac OS X 10.8 (Mountain Lion), яка дозволяє встановлювати змінні середовища для всіх програм як у графічному, так і в термінальному сеансах. Він не тільки відновлює підтримку ~ / .MacOSX / environment.plist в Mountain Lion, але також публікує ваші зміни в оточенні негайно, без необхідності виходити з системи та повертатися назад. <SNIP> EnvPane включає (і автоматично встановлює) a запускаючий агент, який працює 1) на початку після входу в систему і 2) кожного разу, коли ~ / .MacOSX / environment.plist змінюється. Агент зчитує ~ / .MacOSX / environment.plist та експортує змінні середовища з цього файлу в екземпляр запуску поточного користувача через той самий API, який використовується у startctl setenv та startctl unsetenv.

Відмова: Я жодним чином не пов’язаний із розробником або його проектом.

PS Мені подобається це ім’я (звучить як "Закінчується біль").


2
EnvPane наразі не може встановити PATH. Детальніше дивіться у моєму звіті про помилки: github.com/hschmidt/EnvPane/isissue/5
Uwe Günther

Я ♥ ️ ця річ .. Єдиний недолік .. який я думаю, що будь-яке рішення стане жертвою .. це - необхідність перезапустити процес - успадкувати нове «середовище». Вонк підморгував.
Алекс Грей

2
@sorin: Чи можете ви відкрити проблему на сайті GitHub з описом проблеми, яка виникає? EnvPane працює для мене 10.10. Відмова: Я автор EnvPane.
Ганнес

17

Оновлення (2017-08-04)

Оскільки (принаймні) macOS 10.12.6 (Sierra), цей метод, схоже, перестав працювати для Apache httpd (як для, так systemі для userпараметра launchctl config). На інші програми, схоже, це не впливає. Можливо, що це помилка в httpd.

Оригінальна відповідь

Це стосується OS X 10.10+ (особливо 10.11+ через режим без корінь, де /usr/binвже не можна записати).

Я читав у кількох місцях, які використовують launchctl setenv PATH <new path>для встановленняPATH змінної не працює через помилку в OS X (що здається правдою з особистого досвіду). Я виявив, що існує інший спосіб PATHвстановити додатки, не запущені з оболонки :

sudo launchctl config user path <new path>

Цей параметр задокументований на сторінці запуску manc:

конфігураційна система | значення параметра користувача

Встановлює стійку інформацію про конфігурацію для запущених (8) доменів. Можуть бути налаштовані лише системний домен та домени користувачів. Розташування постійного сховища є детальною інформацією про реалізацію, і зміни до цього сховища слід вносити лише за допомогою цієї підкоманди. Перезавантаження потрібно, щоб зміни, внесені за допомогою цієї підкоманди, набули чинності.

[...]

шлях

Встановлює змінну середовища PATH для всіх служб у цільовому домені до рядкового значення. Значення рядка має відповідати формату, окресленому для змінної середовища PATH у середовищі (7). Зауважте, що якщо служба задає свій власний PATH, змінна середовища, що залежить від послуги, матиме перевагу.

ПРИМІТКА. Цей інструмент не можна використовувати для встановлення загальних змінних умов для всіх служб у домені. Він навмисно підпадає під зміну середовища PATH і нічого іншого з міркувань безпеки.

Я підтвердив це, щоб працювати з додатком GUI, запущеним із Finder (який використовується getenvдля отримання PATH). Зауважте, що робити це потрібно лише один раз, і зміна буде постійною через перезавантаження.


Це працює і для мене. sudo launchctl procinfo <gui-pid>показує щойно задане PATHсередовище. Але sudo launchctl config user path <new path>насправді встановлено для всіх користувачів ... (підтверджено додаванням нового користувача та використанням консолі python Sublime Text)
Bossliaw

1
Це, мабуть, не впливає на змінну середовища PATH додатків, які знову відкриваються при вході в систему (які були відкриті при закритті).
Brecht Machiels

Цікаво. Це означатиме, що для додатків, які будуть відновлені, оточення (або його підмножина) зберігається.
Макс Леске

@MaxLeske Ні, повторно відкриті програми запускаються перед зміною змінної середовища. Отже, це відбувається не просто в перший раз після того sudo launchctl config user path, як ви робите це (про що ви, здається, припускаєте?).
Брехт Махіельс

1
@ShlomiSchwartz launchctlніяк НЕ дозволяє встановити довільні змінні оточення. PATHЗмінна є винятком.
Макс Леске

17

На гірському Леві все /etc/pathsі/etc/launchd.conf редагування не робить жодного ефекту!

Форуми розробників Apple кажуть:

"Змініть Info.plist самого .app, щоб він містив словник" LSEn Environmentment "із змінними середовища.

~ / .MacOSX / environment.plist більше не підтримується. "

Тож я безпосередньо редагував програму Info.plist(клацніть правою кнопкою миші на "AppName.app" (в даному випадку SourceTree), а потім " Show package contents").

Показати зміст упаковки

І я додав нову пару ключів / диктантів під назвою:

<key>LSEnvironment</key>
<dict>
     <key>PATH</key>
     <string>/Users/flori/.rvm/gems/ruby-1.9.3-p362/bin:/Users/flori/.rvm/gems/ruby-1.9.3-p362@global/bin:/Users/flori/.rvm/rubies/ruby-1.9.3-p326/bin:/Users/flori/.rvm/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:</string>
</dict>

(див. Документація LaunchServicesKeys в Apple )

Введіть тут опис зображення

Тепер додаток (в моєму випадку Sourcetree) використовує заданий шлях і працює з Git 1.9.3 :-)

PS: Звичайно, ви повинні налаштувати запис "Шлях" під ваші конкретні потреби шляху.


3
Це рішення відповідає стандарту найменш настирливих в системі. Дякую.
Джон Ванс

@John Vance +1 Цілком погоджуюся, що зміни в системі завжди ризиковані, як чітко пояснює Джейсон Т. Міллер у своїй відповіді
rmcsharry

5
Це не впливає на мене в Ель-Капітані. :(
мгл

У High Sierra 10.13, якщо я Info.plistLSOpenURLsWithRole() failed with error -10810 for the file /Applications/Slack.app.
змінюю

16

Хоча відповіді тут не "неправильні", я додам ще: ніколи не вносьте змінних змін середовища в OS X, які впливають на "всі процеси" або навіть за межами оболонки, для всіх процесів, які інтерактивно виконуються даним користувачем.

На мій досвід, глобальні зміни змінних оточуючих середовищ, таких як PATH для всіх процесів, навіть більше шансів порушити ситуацію на OS X, ніж в Windows. Зважаючи на це, велика кількість програм X X та іншого програмного забезпечення (включаючи, мабуть, особливо, компоненти самої ОС) покладаються на інструменти командного рядка UNIX під кришкою і припускають поведінку версій цих інструментів, що надаються в системі, і не обов'язково використовувати абсолютні шляхи при цьому (подібні коментарі стосуються динамічно завантажених бібліотек та змінних середовища DYLD_ *). Вважайте, наприклад, що найвищі відповіді на різні запитання щодо переповнення стека щодо заміни версій інтерпретаторів, що постачаються OS X, як-от Python та Ruby, як правило, говорять "не робіть цього".

OS X насправді не відрізняється від інших UNIX-подібних операційних систем (наприклад, Linux, FreeBSD та Solaris) в цьому відношенні; найімовірніша причина того, що Apple не пропонує простий спосіб зробити це, тому що це порушує речі . Наскільки Windows не є такою схильною до цих проблем, це пов'язано з двома речами: (1) Програмне забезпечення Windows не покладається на інструменти командного рядка, наскільки це робить програмне забезпечення UNIX, і (2) Microsoft має така велика історія як "пекло DLL", так і проблеми безпеки, викликані змінами, які впливають на всі процеси, що вони змінили поведінку динамічного завантаження в новіших версіях Windows, щоб обмежити вплив "глобальних" параметрів конфігурації, таких як PATH.

"Хлумка" чи ні, у вас буде набагато стабільніша система, якщо ви обмежите такі зміни меншими масштабами.


1
Показувати людям не робити те, про що вони запитували, це не відповідь на запитання, яке вони задали. Запобігання людям робити це також порушує речі. Модуль роботи Apple.
frabjous

Налаштування PATH у /Applications/App.app/Contents/Info.plist за допомогою ключа LSEn Environmentment developer.apple.com/library/archive/documentation/General/… може бути поточним рекомендованим рішенням.
Дейв X

15

Іноді всі попередні відповіді просто не працюють. Якщо ви хочете мати доступ до системної змінної (наприклад M2_HOME) в Eclipse або в IntelliJ IDEA, єдине, що працює для мене в цьому випадку, це:

Спочатку (крок 1) редагуйте, /etc/launchd.confщоб містити такий рядок: "VAR значення setenv", а потім (крок 2) перезавантажити.

Просто змінити .bash_profile не буде працювати, оскільки в OS X програми не запускаються, як в інших Unix'es; вони не успадковують змінні оболонки батьків. Усі інші модифікації не працюватимуть з невідомої мені причини. Можливо, хтось ще може про це уточнити.


5
Програми, запущені з Spotlight або будь-яким іншим способом, /etc/launchd.conf читають їх батьківський процес, таким чином роблячи привабливий вибір для того, де встановити змінні середовища, видимі в усіх додатках і оболонках.
Меттью Маккаллоу

1
Дивіться мою відповідь щодо іншого рішення, яке дозволяє уникнути перезавантаження - stackoverflow.com/questions/135688/…
Метт Кертіс,

На моїй машині MaxOS 10.6 немає файлу /etc/launchd.conf. Це або нова, або застаріла річ на цій версії? Або ця машина заплутана?
peterk

13

Після переслідування панелі налаштування параметрів середовища змінних і виявив, що посилання розірвано, і пошук на сайті Apple, схоже, вказує на те, що вони про нього забули ... Я знову почав слідувати невловимий процес запуску.

У моїй системі (Mac OS X 10.6.8) виявляється, що змінні, визначені у environment.plist , надійно експортуються до програм, запущених із Spotlight (через запуск). Моя біда в тому, що ці вар не експортуються на нові баш-сесії в Терміналі. Тобто у мене протилежна проблема, як зображено тут.

ПРИМІТКА: environment.plist виглядає як JSON, а не XML, як описано раніше

Мені вдалося отримати програми Spotlight, щоб побачити варі, відредагувавши ~ / MacOSX / environment.plist, і мені вдалося змусити ці ж vars до нового сеансу терміналу, додавши наступне до мого .profile-файлу:

eval $(launchctl export)

2
Не те, що невловиме: RCen Environment
Gilimanjaro

Приємна порада щодо експорту startctl. Але я не ставлю це як є у .profile. Він замінить ваш $ PATH тим, що не включає / usr / local / bin. Але ви можете скористатись регулярним виразом для вибору вар, які вас цікавлять: `` eval $ (startctl export | grep '^ my. * =').
mivk

3
На моїй новій машині Mountain Lion (10.8.2) середовище.plist абсолютно нічого не потребує. Дивіться відповідь Метью про правильний шлях. Це все про запущене і додаток командного рядка startctl разом з /etc/launchd.conf. Ви можете прочитати самі з man launchd, man launchctlі man launchd.confу вікні терміналу. Рада, що Apple постійно оновлює сторінки чоловіка, навіть якщо Бібліотека розробників Mac трохи відстає.
Рассел Б

10

Будь-який з баша завантажувальних файлів - ~/.bashrc, ~/.bash_profile, ~/.profile. Існує також якийсь дивний файл, названий ~/.MacOSX/environment.plistдля змінних середовища в додатках GUI.


10

Так само, як і відповів Метт Кертіс, я встановлював змінні середовища за допомогою startctl, але я запускаю його у функцію, яку називають експортом, так що коли я експортую змінну, як звичайну, у своєму .bash_profile, вона також встановлюється за допомогою startctl. Ось що я роблю:

  1. Мій .bash_profile складається виключно з одного рядка (Це лише особисті переваги.)

    source .bashrc
  2. Мій .bashrc має таке:

    function export()
    {
        builtin export "$@"
        if [[ ${#@} -eq 1 && "${@//[^=]/}" ]]
        then
            launchctl setenv "${@%%=*}" "${@#*=}"
        elif [[ ! "${@//[^ ]/}" ]]
        then
            launchctl setenv "${@}" "${!@}"
        fi
    }
    
    export -f export
  3. Вищезазначене перевантажить Bash вбудований "експорт" і експортує все нормально (ви помітите, я експортую "експорт" разом з ним!), А потім правильно встановіть їх для середовищ додатків OS X через startctl, будь-яке ви використовуєте з наступного:

    export LC_CTYPE=en_US.UTF-8
    # ~$ launchctl getenv LC_CTYPE
    # en_US.UTF-8
    PATH="/usr/local/bin:${PATH}"
    PATH="/usr/local/opt/coreutils/libexec/gnubin:${PATH}"
    export PATH
    # ~$ launchctl getenv PATH
    # /usr/local/opt/coreutils/libexec/gnubin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
    export CXX_FLAGS="-mmacosx-version-min=10.9"
    # ~$ launchctl getenv CXX_FLAGS
    # -mmacosx-version-min=10.9
  4. Таким чином, мені не потрібно кожного разу надсилати кожну змінну до startctl, і я можу просто налаштувати .bash_profile / .bashrc так, як я хочу. Відкрийте вікно терміналу, перевірте ваші змінні середовища, які вас цікавлять launchctl getenv myVar, щось змініть у вашому .bash_profile / .bashrc, закрийте вікно терміналу та повторно відкрийте його, ще раз перевірте змінну за допомогою startctl та voilá, вона змінена.

  5. Знову ж таки, як і інші рішення для світу після Mountain Mountain Lion, щоб будь-які нові змінні середовища були доступні для додатків, вам потрібно запустити або повторно запустити їх після зміни.


1
Корисна відповідь - спасибі. Я щойно оновив його, оскільки ваше оригінальне рішення не обробляло випадки, коли значення змінної середовища, яке ви встановлювали, було в ньому рівними знаками (наприклад, CXX_FLAGS = "- mmacosx-version-min = 10,9"
Стів Броберг,

@SteveBroberg - лише одна зміна символів виправляє Bhe regexp, не потребуючи sed! (Не зрозумійте мене неправильно, я люблю sed, але це працює і набагато коротше.)
courtlandj

1
Я подумав, що повинен бути кращий спосіб, але я не гуру баш, і я не міг гугл, що таке %%, ## тощо.
Стів Броберг,

10

Ось дуже простий спосіб зробити те, що ви хочете. У моєму випадку це почало працювати Gradle (для Android Studio).

  • Відкрити термінал.
  • Виконайте таку команду:

    sudo nano /etc/paths або sudo vim /etc/paths

  • Введіть свій пароль, коли буде запропоновано.

  • Перейдіть до нижньої частини файлу та введіть шлях, який ви хочете додати.
  • Натисніть Control+, Xщоб вийти.
  • Введіть "Y", щоб зберегти модифікований буфер.
  • Відкрийте нове вікно терміналу, а потім введіть:

    echo $PATH

Ви повинні побачити новий шлях, доданий до кінця ПАТ.

Я отримав ці деталі з цієї публікації:

Додайте до PATH на Mac OS X 10.8 Mountain Lion і вище



7

Щоб бути стислим і зрозумілим, для чого призначений кожен файл

  • ~/.profile отримується щоразу, коли Terminal.app запускається
  • ~/.bashrc там, де "традиційно" встановлені всі експортні заяви для середовища Bash
  • /etc/paths є основним файлом у Mac OS, який містить список шляхів за замовчуванням для побудови змінної середовища PATH для всіх користувачів
  • /etc/paths.d/ містить файли, що містять додаткові шляхи пошуку

Нетермінальні програми не успадковують системні змінні PATH та MANPATH, що робить ваш термінал! Щоб встановити середовище для всіх процесів, запущених конкретним користувачем, таким чином зробивши змінні середовища доступними для додатків GUI Mac OS X, ці змінні повинні бути визначені у вашому ~/.MacOSX/environment.plist(Apple Technical Q&A QA1067)

Використовуйте наступний командний рядок, щоб синхронізувати ваш environment.plistз /etc/paths:

defaults write $HOME/.MacOSX/environment PATH "$(tr '\n' ':' </etc/paths)"

6

/etc/launchd.conf не використовується в OS X v10.10 (Yosemite), OS X v10.11 (El Capitan), macOS v10.12 (Sierra) або macOS v10.13 (High Sierra).


На launchctlчоловіковій сторінці:

/etc/launchd.conf file is no longer consulted for subcommands to run during early boot time;
this functionality was removed for security considerations.

Описаний в цьому методі задавати різні відповіді працюють для мене (після перезавантаження): додатки , запущених з Dock або Spotlight змінних оточення , які успадкують я встановив в ~/Library/LaunchAgents/my.startup.plist. (В моєму випадку, мені потрібно , щоб встановити LANG, щоб en_US.UTF-8для текстового плагін Sublime.)


Під час перезавантаження чи є порядок завантаження, що гарантує завантаження my.startup.plist до того, як програми з останнього сеансу будуть перезапущені?
kunjbhai


3

Це просто:

Відредагуйте ~ / .profile і вкажіть ваші змінні наступним чином

$ vim ~ / .profile

У файл:

MY_ENV_VAR = значення

  1. Зберегти (: wq)

  2. Перезапустіть термінал (Закрийте та відкрийте його знову)

  3. Переконайтесь, що все у порядку:

$ echo $ MY_ENV_VAR

$ значення



3

Для однієї модифікації користувача використовуйте ~/.profileті, які ви вказали. Наступне посилання пояснює, коли Bash читає різні файли.

http://telin.ugent.be/~slippens/drupal/bashrc_and_others

Якщо ви хочете встановити змінну середовища для програм gui, вам потрібен файл ~ / .MacOSX / environment.plist


3

Ну, я не впевнений у файлах /etc/pathsта ~/.MacOSX/environment.plistфайлах. Ці нові.

Але з Bash, ви повинні знати, що .bashrcвиконується з кожним новим викликом оболонки і .bash_profileвиконується лише один раз при запуску.

Я не знаю, як часто це відбувається з Mac OS X. Я думаю, що відмінність зламалася, коли віконна система запустила все.

Особисто я усуваю плутанину, створюючи .bashrcфайл із усім необхідним, а потім виконую:

ln -s .bashrc .bash_profile

3

Окрім того, що слід зазначити на додаток до запропонованих підходів, це те, що принаймні в OS X 10.5 (Leopard) змінені змінні launchd.confоб'єднатимуться з налаштуваннями, зробленими в .profile. Я вважаю, що це може бути справедливим і для налаштувань ~/.MacOSX/environment.plist, але я не підтвердив це.


3

Налаштуйте змінну середовища PATH у Mac OS

Відкрийте програму Terminal (це за замовчуванням у папці Applications / Utilities). Виконайте наступну команду

touch ~/.bash_profile; open ~/.bash_profile

Це відкриє файл у текстовому редакторі за замовчуванням.

Наприклад, для SDK для Android:

Потрібно додати шлях до каталогу інструментів та інструментів платформи Android SDK. У своєму прикладі я буду використовувати "/ Development / android-sdk-macosx" як каталог, в який встановлено SDK. Додайте наступний рядок:

export PATH=${PATH}:/Development/android-sdk-macosx/platform-tools:/Development/android-sdk-macosx/tools

Збережіть файл та закрийте текстовий редактор. Виконайте .bash_profile, щоб оновити свій PATH:

source ~/.bash_profile

Тепер кожного разу, коли ви відкриваєте програму Terminal, ваш PATH включатиме Android SDK.


3

Просто це було дуже просто і швидко. Спочатку створіть ~ / .bash_profile з терміналу:

touch .bash_profile

тоді

open -a TextEdit.app .bash_profile

додати

export TOMCAT_HOME=/Library/Tomcat/Home

збережіть документацію, і ви закінчите.


Perfecto. Я дотримувався кроків для JAVA_HOME, щойно додав експорт JAVA_HOME = / Бібліотека / Java / JavaVirtualMachines / jdk1.8.0_201.jdk / Зміст / Головна та справжній швидкий успіх!
NarendraC

Чудовий @NarendraC!
CodeOverRide

2

Це досить просто. Відредагуйте файл .profile(vi, nano , Sublime Text або інший текстовий редактор). Ви можете знайти його в ~/каталозі (каталозі користувачів) і встановити так:

export MY_VAR=[your value here]

Приклад з домашньою Java:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/current

Збережіть його та поверніться до терміналу.

Ви можете перезавантажити його:

source .profile

Або закрийте і відкрийте вікно свого терміналу.


2

Тут грають два типи снарядів.

  • Невхід в систему: .bashrc перезавантажується щоразу, коли ви запускаєте нову копію Bash
  • Вхід: .profile завантажується лише тоді, коли ви або увійдете в систему, або явно скажете Bash завантажити його та використовувати його як оболонку для входу.

Важливо розуміти , що тут з Bash, файл .bashrcтільки для читання оболонки, це і інтерактивних і не Логін, і ви побачите , що люди часто завантажують .bashrcв , .bash_profileщоб подолати це обмеження.

Тепер, коли ви маєте основне розуміння, перейдемо до того, як я порадив би вам його встановити.

  • .profile: створити його неіснуючим. Покладіть туди налаштування PATH.
  • .bashrc: створити, якщо не існує. Покладіть туди всі свої псевдоніми та спеціальні методи.
  • .bash_profile: створити, якщо він не існує. Покладіть туди наступне.

.bash_file:

#!/bin/bash
source ~/.profile # Get the PATH settings
source ~/.bashrc  # Get Aliases and Functions
#

2

Оболонки для входу

/etc/profile

Оболонка спочатку виконує команди у файлі /etc/profile. Користувач, що працює з кореневими привілеями, може налаштувати цей файл для встановлення загальносистемних характеристик за замовчуванням для користувачів, що працюють під керуванням Bash.

.bash_profile
.bash_login
.profile

Далі виглядають оболонки для ~/.bash_profile, ~/.bash_loginі ~/.profile(~ / є коротко- рука для вашої домашньої директорії), в зазначеному порядку, виконання команд в першому з цих файлів , які він знаходить. Ви можете помістити команди в один із цих файлів, щоб змінити встановлені за замовчуванням /etc/profile. Оболонка, що працює на віртуальному терміналі, не виконує команди в цих файлах.

.bash_logout

Коли ви виходите, bash виконує команди в ~/.bash_logout файлі. Цей файл часто містить команди, які очищаються після сеансу, такі, як видалення тимчасових файлів.

Інтерактивні нелогінні оболонки

/etc/bashrc

Хоча не називається bash безпосередньо, багато ~/.bashrcфайлів дзвонять /etc/bashrc. Ця настройка дозволяє користувачеві, що працює з кореневими привілеями, встановлювати загальносистемні характеристики за замовчуванням для оболонок bash nonlogin.

.bashrc

Інтерактивна нелогіна оболонка виконує команди у ~/.bashrcфайлі. Зазвичай файл запуску для оболонки для входу, наприклад .bash_profile, запускає цей файл, тому оболонки входу та нелогін виконують команди в .bashrc.

Оскільки команди у програмі .bashrcможуть виконуватися багато разів, а тому, що підрозділи успадковують експортовані змінні, це гарна ідея розмістити команди, що додають до існуючих змінних у .bash_profileфайлі.


2

Вся магія в iOS йде лише з використанням sourceфайлу, куди ви експортуєте змінні середовища.

Наприклад:

Ви можете створити такий файл:

export bim=fooo
export bom=bar

Збережіть цей файл як bimbom.envі зробітьsource ./bimbom.ev . Voilá, ти маєш змінні середовища.

Перевірте їх за допомогою:

echo $bim

1

Для Bash спробуйте додати змінні середовища до файлу, /etc/profileщоб зробити їх доступними для всіх користувачів. Не потрібно перезавантажувати, просто розпочніть нову сесію терміналу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.