Змінні середовища в Mac OS X


186

Оновлення: Посилання нижче не має повної відповіді . Потрібно встановити шлях або змінну у двох місцях (один для GUI і один для оболонки) - кульгаво.

Не повторюється : Встановлення змінних середовища в OS X?


Виходячи з фону Windows, де дуже легко встановлювати та змінювати змінні середовища (просто перейдіть до Властивості системи> Додатково> Змінні середовища), схоже, це не так прямо в Mac OS 10.5. Більшість посилань говорить, що я повинен оновити / etc / profile або ~ / .profile. Ці еквіваленти системних змінних та змінних користувачів? Наприклад, де я можу встановити свою JAVA_HOMEзмінну?


Редагувати:

Я хочу мати доступ до змінної з терміналу, а також до додатка на зразок Eclipse. Крім того, я сподіваюся, що мені не доведеться перезавантажувати / виходити з системи, щоб це вступило в силу.


І є відповіді на відповіді на питання посилання, яке тут не повторюється ...
dmckee --- колишнє кошеня-модератор

Відповіді:


142

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

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

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

Змінні середовища не оновлюються автоматично в запущених додатках. Вам потрібно буде перезапустити програми, щоб отримати оновлені змінні середовища (хоча ви можете просто встановити змінні в оболонці, наприклад PATH=whatever:you:want; немає необхідності перезапускати термінал).


1
Схоже, найкраща відповідь поки що, немає потреби в сторонньому додатку!
Абдулла Джибалі

2
Це не виглядає глобально: змінні середовища, встановлені таким чином, є локальними для користувача. У нас все ще немає глобального механізму встановлення змінної середовища.
Андрій

@Andrew Що ти означає, місцевий для користувача? Я б очікував, що всі процеси згодом, запущені з запуску, будуть зачеплені.
Метт Кертіс

@MattCurtis: Змінні середовища, встановлені через, launchctl setenvздаються, бачать лише користувач, який вносить зміни. Якщо я встановив змінну як звичайний користувач, він не видно корінь (через sudo) і навпаки.
Андрій

2
@Andrew Добре, root має власний запуск - ps aux | grep launchdпокаже це. Також перевірте man sudo, які документи, які sudo(за замовчуванням) навмисно скидає середовище - якщо ви sudo -Eзбережете це середовище (включаючи змінні, які ви встановили launchctl setenv). У вас, до речі, є реальна заявка на це? Якщо так, чи працює цей метод для вас?
Метт Кертіс

299

Є кілька місць, де можна встановити змінні середовища.

  • ~/.profile: використовуйте це для змінних, які ви хочете встановити у всіх програмах, запущених з терміналу (зауважте, що, на відміну від Linux, всі оболонки, відкриті в Terminal.app, є оболонками входу).
  • ~/.bashrc: це викликається оболонками, які не є оболонками для входу. Використовуйте це для псевдонімів та інших речей, які потрібно переосмислити в підрозділах, а не для змінних середовищ, які успадковуються.
  • /etc/profile: це завантажується перед ~ / .profile, але інакше еквівалентно. Використовуйте його, коли ви хочете, щоб змінна застосовувалася до термінальних програм, запущених усіма користувачами на машині (якщо припустимо, що вони використовують bash).
  • ~/.MacOSX/environment.plist: це зчитується через loginwindow під час входу. Він поширюється на всі програми, включаючи графічні інтерфейси, за винятком програм, запущених Spotlight у 10.5 (не 10.6). Щоб зміни набрали чинності, потрібно вийти з системи та знову увійти. Цей файл більше не підтримується з OS X 10.8.
  • launchdекземпляр вашого користувача : це стосується всіх програм, запущених користувачем, GUI та CLI. Ви можете застосувати зміни в будь-який час, скориставшись setenvкомандою в launchctl. Теоретично , ви повинні мати можливість вводити setenvкоманди ~/.launchd.confта launchdавтоматично читати їх, коли користувач увійде в систему, але на практиці підтримка цього файлу так і не була реалізована. Натомість ви можете використовувати інший механізм для виконання скрипту при вході в систему і мати цей виклик сценарію launchctlдля створення launchdсередовища.
  • /etc/launchd.conf: це зчитується при запуску при запуску системи та при вході в систему користувача. Вони впливають на кожен процес у системі, оскільки запуск - це кореневий процес. Щоб застосувати зміни до запущеного кореневого запуску, ви можете передати команди в sudo launchctl.

Основні речі, які слід зрозуміти:

  • змінні середовища успадковуються дітьми процесу під час їх розщеплення.
  • кореневий процес є запущеним екземпляром, а також існує окремий екземпляр запуску на сеанс користувача.
  • запуск дозволяє змінювати поточні змінні середовища за допомогою launchctl; оновлені змінні потім успадковуються усіма новими процесами, з яких він розвивається.

Приклад встановлення змінної середовища із запуском:

echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl

Тепер запустіть додаток GUI, який використовує змінну, і voila!

Щоб вирішити те, що ~/.launchd.confне працює, ви можете помістити такий сценарій у ~/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>

Потім ви можете помістити setenv REPLACE_WITH_VAR REPLACE_WITH_VALUEвсередину ~/.launchd.conf, і це буде виконуватися при кожному вході.

Зауважте, що, переносячи таким чином список команд у startctl, ви не зможете встановити змінні середовища зі значеннями, що містять пробіли. Якщо вам потрібно зробити це так, ви можете зателефонувати launchctl наступним чином : launchctl setenv MYVARIABLE "QUOTE THE STRING".

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


3
На насправді, в відношенні ~/.MacOSX/environment.plist, на мій лев він буде читати і використовується. Просто перевірив це. Я насправді віддаю перевагу цьому .launchd.conf, оскільки для його підтримки використовую панель налаштування RCen Environment .
Gilimanjaro

5
Не можу ~/.launchd.confпрацювати 10.6.8 - це, мабуть, не має ніякого ефекту. Також на сторінці сторінки вказано, що цей файл наразі не підтримується.
snowcrash09

4
~ / .launchd.conf, здається, не працює і 10.7.3, і коли я дивлюся на сторінку чоловіка, він говорить $ HOME / .launchd.conf Ваш файл конфігурації запуску (наразі не підтримується)
нереалізований

4
У 10.8 (Mountain Lion) ~ / .MacOSX / environment.plist більше не підтримується. На думку Apple Dev, потрібно "Змінити Info.plist самого .app, щоб містити словник" LSEnvironment "зі змінними середовища." Для отримання додаткової інформації дивіться apple.stackexchange.com/questions/57385/…
pnkfelix

3
@LaC Чудовий, всеосяжний пост; Ви можете оновити його, щоб зауважити, що ~/.launchd.confвін все ще не підтримується і не працює як OS X 10.8.3? Дивітьсяman launchd.conf
mklement0

12

Я думаю, що ОП шукає - це просте рішення, схоже на вікна.

ось ви йдете:

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


1
Ого, це виглядає круто. я ще не пробував цього, але виглядає як саме те, що мені було потрібно в описі.
Абдулла Джибалі

6
btw, схоже, вихідне посилання зламалось з моменту публікації його (у чому справа Apple? 301 коштують дорого?). Ви можете скористатися цим посиланням замість цього: macupdate.com/app/mac/14617/rcenvironment
Том Теман

Це справді старе. Перегляньте іншу відповідь, що згадує osx-env-sync для сучасного рішення, яке працює навіть в OS X 10.10 (Yosemite) і вище.
Warren P

1
Будь ласка, узагальнюйте інформацію за посиланням у своїй відповіді. Як ми вже бачили, посилання розриваються з різних причин.
користувач3.1415927

7

Ви можете прочитати на linux, що досить близько до того, що таке Mac OS X. Або ви можете прочитати на BSD Unix, який трохи ближче. Здебільшого відмінності між Linux та BSD не мають великої кількості.

/etc/profile є змінними системного середовища.

~/.profile - змінні середовища, що залежать від користувача.

"де мені слід встановити змінну JAVA_HOME?"

  • У вас є кілька користувачів? Їм все одно? Ви б зіпсували когось іншого користувача, змінивши /etc/profile?

Взагалі, я вважаю за краще не возитися з загальносистемними налаштуваннями, хоча я єдиний користувач. Я вважаю за краще редагувати свої локальні налаштування.


5

Для програм GUI вам доведеться створювати та редагувати ~/.MacOSX/environment.plist. Детальніше тут . Вам потрібно буде вийти з системи, щоб набути чинності. Я не впевнений, чи вплинуть вони також і на програми, запущені з терміналу, але я припускаю, що вони будуть.

Для додатків, запущених з терміналу, ви також можете редагувати файл ~ / .profile.


2
Так, термінал успадкує змінні, як і все, що запускається з терміналу. Ви можете використовувати панель уподобань RCenvironment для підтримки змінних.
Гіліманджаро

1
Це рішення більше не працює з деякими версіями Mac OS X v10.7. Це не стосується будь-якої версії Mac OS X v10.8 або новішої версії. Натомість дивіться: stackoverflow.com/a/4567308/543738
LS

3

Просто відкрийте ~/.profileфайл через nanoтермінал і введіть там:

export PATH=whatever/you/want:$PATH

Збережіть цей файл (cmd + X і Y). Після цього знову вийдіть / увійдіть або просто відкрийте нову вкладку в Terminal і спробуйте скористатися новою змінною.

МОЛЯЙТЕ НЕ забудьте додати ": $ PATH" після того, що / що / ви хочете, інакше ви видалите всі шляхи в змінній PATH, які були там до цього.


4
Це стосується лише середовища команд bash. Застосовані тут змінні не бачать програми GUI.
Воррен П

3

Синхронізуйте змінні середовища OS X для програм командного рядка та графічного інтерфейсу з одного джерела з osx-env-sync .

Я також відправив відповідь на відповідне питання тут .


Це фантастично. Рекомендація: Покладіть у сценарій речі startctl unload / launctl load "refresh now". Я назвав це osx-env-sync-now.sh. Я змінюю свій .bash_profile і запускаю маленький сценарій "оновити зараз" і продовжую. Я думаю, що тут є наслідки для безпеки, тому я думаю, що слід зробити деякі обмеження. Повинні бути причини, що вони вимкнули цю функцію в OS X.
Warren P

@WarrenP Готово! Перевірте репо.
Ерсін Ер

Відмінно. Це вирішило багато болю для мене. Один з випадків, коли це дійсно корисно - це для всіх, хто розвивається разом із SCALA. Налаштування SCALA_HOME як для шкали командного рядка, так і для масштабування графічного інтерфейсу (наприклад, у Netbeans) - це справжній біль.
Warren P

0

Якщо ви хочете постійно змінювати змінні середовища в macOS, встановіть їх /etc/paths. Зауважте , цей файл за замовчуванням доступний лише для читання, тому вам доведеться chmod для дозволу на запис.


Це не працює для мене. Я маю /usr/bin/localв цьому файлі, навіть не змінюючи файл, він був таким способом за замовчуванням, і все ж мої програми GUI бачать лише /usr/bin:/bin:/usr/sbin:/sbin. Я перезавантажувався багато разів.
мгмоль

@m_gol Що ви отримуєте, коли біжите cat /etc/paths/?
ІгорГанапольський

1
/ usr / local / bin, / usr / bin, / bin, / usr / sbin, / sbin, в окремих рядках. І все ж SourceTree бачить усіх, крім першого.
мгдол

Ви можете змінити параметр "Якщо ви хочете змінити шлях за замовчуванням у macOS". Це не має нічого спільного з більш загальною проблемою змінних середовищ.
rfay

0

Для користувачів Mac OS X Catalina 2020:

Забудьте про інші марні відповіді, тут потрібні лише два кроки:

  1. Створіть файл із умовою іменування: пріоритет-ім’я програми. Потім скопіюйте вставте шлях, до якого потрібно додати PATH.

    Наприклад, 80-vscodeіз вмістом /Applications/Visual Studio Code.app/Contents/Resources/app/bin/у моєму випадку.

  2. Перемістити цей файл до /etc/paths.d/. Не забудьте відкрити нову вкладку (новий сеанс) у Терміналі та введіть, echo $PATHщоб перевірити, чи додано ваш шлях!

Зауважте: цей метод додає лише ваш шлях PATH.

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