Настройка переменных среды через launchd.conf больше не работает в OS X Yosemite / El Capitan / macOS Sierra?

Похоже, что launchd.conf больше не загружает мою переменную среды. Кто-нибудь еще заметил это?

Есть ли еще одно решение для постоянной установки переменных среды?

    Создайте файл environment.plist в ~/Library/LaunchAgents/ с этим контентом:

         Label my.startup ProgramArguments  sh -c  launchctl setenv PRODUCTS_PATH /Users/mortimer/Projects/my_products launchctl setenv ANDROID_NDK_HOME /Applications/android-ndk launchctl setenv PATH $PATH:/Applications/gradle/bin   RunAtLoad    

    Вы можете добавить много команд launchctl внутри блока .

    Пластинка активируется после перезагрузки системы. Вы также можете использовать launchctl load ~/Library/LaunchAgents/environment.plist чтобы запустить его немедленно.

    [Редактировать]

    То же самое решение работает и в El Capitan.

    Xcode 7.0+ по умолчанию не оценивает переменные среды. Старое поведение можно включить с помощью этой команды:

    defaults write com.apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO

    [Редактировать]

    Там пара ситуаций, когда это не совсем работает. Если компьютер перезагружен и выбран «Повторно открыть windows при входе в систему», вновь открытые windows могут не видеть переменные (возможно, они открыты до запуска агента). Кроме того, если вы входите в систему через ssh, переменные не будут установлены (так что вам нужно будет установить их в ~ / .bash_profile). Наконец, это, похоже, не работает для PATH на Эль-Капитане и Сьерре. Это нужно установить с помощью «пути пользователя запуска» и в / etc / paths.

    [ Исходный ответ ]: Вы все равно можете использовать launchctl setenv variablename value для установки переменной, чтобы она была воспринята всеми приложениями (графические приложения, запущенные через Dock или Spotlight, в дополнение к тем, которые запускались через терминал).

    Очевидно, вы не захотите делать это каждый раз, когда вы входите в систему.

    [ Изменить ]: Чтобы этого избежать, запустите AppleScript Editor , введите команду следующим образом:

     do shell script "launchctl setenv variablename value" 

    (Используйте несколько строк, если вы хотите установить несколько переменных)

    Теперь сохраните ( + s ) в качестве формата файла: приложение . Наконец откройте « System Settings → « Пользователи и группы» → « Элементы входа» и добавьте новое приложение.

    [ Исходный ответ ]: Чтобы обойти это место всеми переменными, которые вы хотите определить в коротком сценарии оболочки, ознакомьтесь с этим предыдущим ответом о том, как запустить скрипт для входа в MacOS . Таким образом, сценарий будет вызываться, когда пользователь войдет в систему.

    [ Изменить ]: ни одно решение не является идеальным, поскольку переменные будут установлены только для этого конкретного пользователя, но я надеюсь / угадаю, что это может быть все, что вам нужно.

    Если у вас есть несколько пользователей, вы можете вручную установить элемент входа для каждого из них или поместить копию com.user.loginscript.plist в каждый из своих локальных каталогов Library / LaunchAgents , указав один и тот же сценарий оболочки.

    Конечно, ни одно из этих обходных решений не так удобно, как /etc/launchd.conf .

    [ Дальнейшее редактирование ]: пользователь ниже упоминает, что это не сработало для него. Однако я тестировал несколько машин Yosemite, и это работает для меня. Если у вас возникли проблемы, помните, что вам нужно будет перезапустить приложения, чтобы это вступило в силу. Кроме того, если вы устанавливаете переменные в терминале через ~ / .profile или ~ / .bash_profile , они переопределяют все значения, установленные с помощью startctl setenv для приложений, запущенных из оболочки .

    Можно задать переменные среды в Mac OS X 10.10 Yosemite с 3 файлами + 2 команды.

    Основной файл с определением переменных среды:

     $ ls -la /etc/environment -r-xr-xr-x 1 root wheel 369 Oct 21 04:42 /etc/environment $ cat /etc/environment #!/bin/sh set -e syslog -s -l warn "Set environment variables with /etc/environment $(whoami) - start" launchctl setenv JAVA_HOME /usr/local/jdk1.7 launchctl setenv MAVEN_HOME /opt/local/share/java/maven3 if [ -x /usr/libexec/path_helper ]; then export PATH="" eval `/usr/libexec/path_helper -s` launchctl setenv PATH $PATH fi osascript -e 'tell app "Dock" to quit' syslog -s -l warn "Set environment variables with /etc/environment $(whoami) - complete" 

    Определение службы для загрузки переменных среды для пользовательских приложений (терминал, IDE, …):

     $ ls -la /Library/LaunchAgents/environment.user.plist -rw------- 1 root wheel 504 Oct 21 04:37 /Library/LaunchAgents/environment.user.plist $ sudo cat /Library/LaunchAgents/environment.user.plist     Label environment.user ProgramArguments  /etc/environment  KeepAlive  RunAtLoad  WatchPaths  /etc/environment    и $ ls -la /Library/LaunchAgents/environment.user.plist -rw------- 1 root wheel 504 Oct 21 04:37 /Library/LaunchAgents/environment.user.plist $ sudo cat /Library/LaunchAgents/environment.user.plist     Label environment.user ProgramArguments  /etc/environment  KeepAlive  RunAtLoad  WatchPaths  /etc/environment    и $ ls -la /Library/LaunchAgents/environment.user.plist -rw------- 1 root wheel 504 Oct 21 04:37 /Library/LaunchAgents/environment.user.plist $ sudo cat /Library/LaunchAgents/environment.user.plist     Label environment.user ProgramArguments  /etc/environment  KeepAlive  RunAtLoad  WatchPaths  /etc/environment    

    Такое же определение службы для пользовательских приложений root:

     $ ls -la /Library/LaunchDaemons/environment.plist -rw------- 1 root wheel 499 Oct 21 04:38 /Library/LaunchDaemons/environment.plist $ sudo cat /Library/LaunchDaemons/environment.plist     Label environment ProgramArguments  /etc/environment  KeepAlive  RunAtLoad  WatchPaths  /etc/environment    и $ ls -la /Library/LaunchDaemons/environment.plist -rw------- 1 root wheel 499 Oct 21 04:38 /Library/LaunchDaemons/environment.plist $ sudo cat /Library/LaunchDaemons/environment.plist     Label environment ProgramArguments  /etc/environment  KeepAlive  RunAtLoad  WatchPaths  /etc/environment    и $ ls -la /Library/LaunchDaemons/environment.plist -rw------- 1 root wheel 499 Oct 21 04:38 /Library/LaunchDaemons/environment.plist $ sudo cat /Library/LaunchDaemons/environment.plist     Label environment ProgramArguments  /etc/environment  KeepAlive  RunAtLoad  WatchPaths  /etc/environment    

    И, наконец, мы должны зарегистрировать эти службы:

     $ launchctl load -w /Library/LaunchAgents/environment.user.plist $ sudo launchctl load -w /Library/LaunchDaemons/environment.plist 

    Что мы получаем:

    1. Единственное место, где можно объявить переменные системной среды: / etc / environment
    2. Моментальное автоматическое обновление переменных среды после изменения файла / etc / environment – просто перезапустите приложение

    Проблемы / проблемы:

    Чтобы ваши переменные env были правильно приняты приложениями после перезагрузки системы, вам понадобятся:

    • либо дважды войти: login => logout => login
    • или закрыть и повторно открыть приложения вручную, где должны быть приняты переменные env
    • или НЕ использовать функцию «Повторно открыть windows при регистрации».

    Это происходит из-за того, что Apple отказывает в явном упорядочении загруженных сервисов, поэтому переменные env регистрируются параллельно с обработкой «повторной очереди».

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

    Процитировано из

    Apple Developer Relations 10-Oct-2014 09:12 PM

    После долгих размышлений техника удалила эту функцию. Файл /etc/launchd.conf был намеренно удален из соображений безопасности. В качестве обходного пути вы можете запустить launchctl limit как root в начале загрузки, возможно, из LaunchDaemon . (…)

    Решение:

    Поместите код в /Library/LaunchDaemons/com.apple.launchd.limit.plist помощью bash-script:

     #!/bin/bash echo '    Label eicar ProgramArguments  /bin/launchctl limit core unlimited  RunAtLoad  ServiceIPC   ' | sudo tee /Library/LaunchDaemons/com.apple.launchd.limit.plist 

    Вот команды для восстановления старого поведения:

     # create a script that calls launchctl iterating through /etc/launchd.conf echo '#!/bin/sh while read line || [[ -n $line ]] ; do launchctl $line ; done < /etc/launchd.conf; ' > /usr/local/bin/launchd.conf.sh # make it executable chmod +x /usr/local/bin/launchd.conf.sh # launch the script at startup echo '    Label launchd.conf ProgramArguments  sh -c /usr/local/bin/launchd.conf.sh  RunAtLoad    ' > /Library/LaunchAgents/launchd.conf.plist 

    Теперь вы можете указать команды, такие как setenv JAVA_HOME /Library/Java/Home в /etc/launchd.conf .

    Проверено на Эль Капитан.

    Что для меня работало (вдохновлено спасибо aax):

    Вставьте это в /Library/LaunchDaemons/com.apple.launchd.limit.plist, затем перезагрузите компьютер:

         Label eicar ProgramArguments  /bin/launchctl limit maxfiles 16384 16384  RunAtLoad  ServiceIPC    

    Если вам это нужно, шаг за шагом:

    • Запуск терминала
    • Введите sudo su, затем введите свой пароль для входа в систему с правами root
    • Тип vi /Library/LaunchDaemons/com.apple.launchd.limit.plist
    • Когда в редактор vi, нажмите клавишу i, чтобы войти в режим вставки, затем вставьте точный код выше ( ⌘+v ). Это приведет к ограничению до 16384 файлов на каждый процесс и 16384 файлов всего
    • Сохраните файл и закройте с помощью esc :wq
    • Перезагрузите свою систему и убедитесь, что она работает с использованием предела запуска launchct

    Надеюсь, это вам помогло.

    Попробуйте https://github.com/ersiner/osx-env-sync . Он обрабатывает как командную строку, так и графические приложения из одного источника и работает с последней версией OS X (Yosemite).

    Вы можете использовать замены путей и другие трюки оболочки, так как то, что вы пишете, является обычным сценарием bash, который будет использоваться bash в первую очередь. Нет ограничений .. (Проверьте документацию osx-env-sync, и вы поймете, как это достигается.)

    Я ответил на аналогичный вопрос, где вы найдете больше.

    Решение состоит в том, чтобы добавить вашу переменную в /etc/profile . Тогда все работает так, как ожидалось! Конечно, вы ДОЛЖНЫ делать это как пользователь root с sudo nano / etc / profile. Если вы отредактируете его каким-либо другим способом, система будет жаловаться на поврежденный / etc / profile, даже если вы измените права на root.

    Я добавил переменные в ~ / .bash_profile следующим образом. После завершения перезапуска / выхода из системы и входа в систему

     export M2_HOME=/Users/robin/softwares/apache-maven-3.2.3 export ANT_HOME=/Users/robin/softwares/apache-ant-1.9.4 launchctl setenv M2_HOME $M2_HOME launchctl setenv ANT_HOME $ANT_HOME export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/robin/softwares/apache-maven-3.2.3/bin:/Users/robin/softwares/apache-ant-1.9.4/bin launchctl setenv PATH $PATH 

    ПРИМЕЧАНИЕ: без перезапуска / выхода из системы и входа в систему вы можете применить эти изменения, используя;

     source ~/.bash_profile 
    Interesting Posts

    import .R не может быть разрешен при импорте actionbarsherlock

    Где хранить JWT в браузере? Как защитить от CSRF?

    Предварительно скомпилированные заголовки с GCC

    Общая легенда для нескольких графиков в R

    Точный поиск Outlook не работает?

    jQuery Подтвердить плагин – проверка пароля – минимальные требования – Regex

    Как связать использование GCC без -l или пути hardcoding для библиотеки, которая не соответствует соглашению об именах libNAME.so?

    Неизменяемые объекты являются streamобезопасными, но почему?

    django orm, как просмотреть (или зарегистрировать) выполненный запрос?

    Не удается удалить папку в качестве администратора, запрашивает у администратора пользователя, которого не существует, – «вам нужно предоставить разрешение администратора для удаления этой папки»

    Преобразовать System.Windows.Media.ImageSource в System.Drawing.Bitmap

    дважды загружается в Google Chrome

    Как сравнить объект Color и получить ближайший цвет в цвете ?

    Является ли вложение данных фонового изображения в CSS в качестве хорошей или плохой практики Base64?

    jQuery – включение / выключение флажка

    Давайте будем гением компьютера.