Переменные среды в Mac OS X

186

Обновление: ссылка ниже не имеет полного ответа . Необходимость указывать путь или переменную в двух местах (одно для графического интерфейса пользователя, а другое для оболочки) неэффективно.

Не дублирует : установка переменных среды в OS X?


Исходя из фона Windows, где очень легко устанавливать и изменять переменные среды (просто перейдите в «Свойства системы»> «Дополнительно»> «Переменные среды»), в Mac OS 10.5 это не так уж и просто. Большинство ссылок говорят, что я должен обновить / etc / profile или ~ / .profile. Являются ли они эквивалентом системных переменных и пользовательских переменных? Например, где я должен установить свою JAVA_HOMEпеременную?


РЕДАКТИРОВАТЬ:

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

Абдулла Джибали
источник
И есть несколько советов в ответах на вопрос о ссылке, который здесь не повторяется ...
dmckee --- котенок экс-модератора

Ответы:

142

Там нет необходимости для дублирования. Вы можете установить переменные окружения, используемые launchd (и дочерние процессы, т.е. все, что вы запускаете из Spotlight), используя launchctl setenv.

Например, если вы хотите отразить ваш текущий путь в launchd после его настройки .bashrcили где-то еще:

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

Переменные среды не обновляются автоматически в запущенных приложениях. Вам нужно будет перезапустить приложения, чтобы получить обновленные переменные среды (хотя вы можете просто установить переменные в вашей оболочке, например PATH=whatever:you:want, нет необходимости перезапускать терминал).

Мэтт Кертис
источник
1
Похоже, лучший ответ на данный момент, нет необходимости в стороннем приложении!
Абдулла Джибали
2
Это не похоже на глобальность: переменные окружения, установленные таким образом, являются локальными для пользователя. У нас все еще нет глобального механизма для установки переменной среды.
Андрей
@ Andrew Что вы имеете в виду, локально для пользователя? Я ожидаю, что будут затронуты все процессы, запущенные впоследствии с launchd.
Мэтт Кертис
@MattCurtis: переменные среды, заданные через, launchctl setenvкажутся видимыми только пользователю, вносящему изменения. Если я установлю переменную как обычный пользователь, она не будет видна пользователю root (через sudo) и наоборот.
Андрей
2
@ Андрей ОК, root имеет свой собственный launchd - 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: это читается командой launchd при запуске системы и при входе пользователя в систему. Они влияют на каждый отдельный процесс в системе, поскольку launchd является корневым процессом. Чтобы применить изменения к запущенному root launchd, вы можете передать команды вsudo launchctl .

Основные вещи для понимания:

  • Переменные среды наследуются дочерними процессами во время их разветвления.
  • корневой процесс является экземпляром launchd, и для каждого сеанса пользователя также существует отдельный экземпляр launchd.
  • launchd позволяет вам изменять его текущие переменные окружения, используя launchctl; обновленные переменные затем наследуются всеми новыми процессами, которые он затем разветвляет.

Пример установки переменной среды с помощью launchd:

echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl

Теперь запустите ваше приложение с графическим интерфейсом, которое использует переменную, и вуаля!

Чтобы обойти тот факт, что ~/.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, и это будет выполняться при каждом входе в систему.

Обратите внимание, что при такой передаче списка команд в launchctl вы не сможете устанавливать переменные окружения со значениями, содержащими пробелы. Если вам нужно сделать это так, вы можете позвонить launchctl следующим образом : launchctl setenv MYVARIABLE "QUOTE THE STRING".

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

лак
источник
3
На самом деле, в отношении ~/.MacOSX/environment.plist, на мой лев он будет читать и используется. Просто проверил это. Я на самом деле предпочитаю это, а не .launchd.conf, потому что я использую панель настроек RCenvironment, чтобы поддерживать это.
Гилиманджаро
5
Не могу приступить ~/.launchd.confк работе над 10.6.8 - похоже, это не имеет никакого эффекта. Также на странице man сказано, что этот файл в данный момент не поддерживается.
snowcrash09
4
~ / .launchd.conf, похоже, тоже не работает на 10.7.3, и когда я просматриваю справочную страницу, он говорит: $ HOME / .launchd.conf Ваш файл конфигурации launchd (в настоящее время не поддерживается)
неактивно
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

Я думаю, что OP ищет простое, похожее на Windows решение.

вот и я

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

Том Теман
источник
1
Вау, это выглядит круто. еще не пробовал, но выглядит именно то, что мне нужно из описания.
Абдулла Джибали
6
Кстати, оригинальная ссылка, кажется, сломалась с тех пор, как я ее опубликовал (в чем дело, Apple? 301 дороже?). Вместо этого вы можете использовать эту ссылку: macupdate.com/app/mac/14617/rcenvironment
Том Теман
Это действительно старый. Проверьте другой ответ, в котором упоминается osx-env-sync для современного решения, которое работает даже в OS X 10.10 (Yosemite) и выше.
Уоррен П
1
Пожалуйста, обобщите информацию по ссылке в вашем ответе. Как мы уже видели, ссылки ломаются по разным причинам.
user3.1415927
7

Вы можете прочитать о Linux, который довольно близок к тому, что Mac OS X. Или вы можете прочитать о BSD Unix, который немного ближе. По большей части различия между Linux и BSD невелики.

/etc/profile системные переменные среды

~/.profile пользовательские переменные среды.

"где я должен установить переменную JAVA_HOME?"

  • У вас есть несколько пользователей? Они заботятся? Не могли бы вы испортить другого пользователя, изменив /etc/profile?

Как правило, я предпочитаю не связываться с общесистемными настройками, хотя я единственный пользователь. Я предпочитаю редактировать свои локальные настройки.

С. Лотт
источник
5

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

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

JW.
источник
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). После этого, пожалуйста, выйдите из системы / войдите снова или просто откройте новую вкладку в Терминале и попробуйте использовать новую переменную.

ПОЖАЛУЙСТА, НЕ забывайте добавлять ": $ PATH" после того, что вы хотите, иначе вы удалите все пути в переменной PATH, которые были до этого.

Migele
источник
4
Это относится только к командной среде bash. Переменные, которые вы здесь задаете, не видны в приложениях с графическим интерфейсом.
Уоррен П
3

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

Я также разместил ответ на связанный вопрос здесь .

Эрсин Эр
источник
Это фантастика. Предложение: Поместите в скрипт скрипт launchctl unload / launctl load "refresh now". Я назвал это osx-env-sync-now.sh. Я изменяю свой .bash_profile, запускаю небольшой скрипт «обновить сейчас» и продолжаю. Я думаю, что здесь есть последствия для безопасности, поэтому я думаю, что некоторые ограничения должны быть сделаны. Должны быть причины, по которым они отключили эту возможность в OS X.
Уоррен П
@WarrenP Готово! Проверьте репо.
Эрсин Эр
Превосходно. Это решило много боли для меня. Одним из случаев, когда это действительно полезно, является любой, кто разрабатывает со SCALA. Установка SCALA_HOME как для командной строки scala, так и для GUI scala (например, в NetBeans) в противном случае является настоящей болью.
Уоррен П
0

Если вы хотите постоянно изменять переменные окружения в macOS, установите их в /etc/paths. Обратите внимание , что этот файл доступен только для чтения по умолчанию, поэтому вам придется использовать chmod для разрешения записи.

IgorGanapolsky
источник
Это не работает для меня. У меня есть /usr/bin/localв этом файле, даже без изменения файла, так было по умолчанию, и все же мои приложения с графическим интерфейсом видят только /usr/bin:/bin:/usr/sbin:/sbin. Я много раз перезагружался.
mgol
@m_gol Что ты получаешь, когда бежишь cat /etc/paths/?
Игорь Ганапольский
1
/ usr / local / bin, / usr / bin, / bin, / usr / sbin, / sbin, в отдельных строках. И все же SourceTree видит их все, кроме первого.
mgol
Вы можете изменить на «Если вы хотите изменить путь по умолчанию в macOS». Это не имеет ничего общего с более общей проблемой переменных среды.
rfay
0

Для пользователей Mac OS X Catalina 2020 года:

Забудьте о других бесполезных ответах, здесь нужно всего два шага:

  1. Создайте файл с соглашением об именах: priority-appname. Затем скопируйте и вставьте путь, который вы хотите добавить PATH.

    Например, 80-vscodeс содержанием /Applications/Visual Studio Code.app/Contents/Resources/app/bin/в моем случае.

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

Обратите внимание: этот метод только добавляет ваш путь к PATH.

Льется
источник