Il semble que le launchd.conf
ne charge plus ma variable d'environnement. Quelqu'un d'autre a-t-il remarqué cela?
Existe-t-il une autre solution pour définir de manière permanente les variables d'environnement?
Il semble que le launchd.conf
ne charge plus ma variable d'environnement. Quelqu'un d'autre a-t-il remarqué cela?
Existe-t-il une autre solution pour définir de manière permanente les variables d'environnement?
Réponses:
Créez un environment.plist
fichier ~/Library/LaunchAgents/
avec ce contenu:
<?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>my.startup</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>
launchctl setenv PRODUCTS_PATH /Users/mortimer/Projects/my_products
launchctl setenv ANDROID_NDK_HOME /Applications/android-ndk
launchctl setenv PATH $PATH:/Applications/gradle/bin
</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Vous pouvez ajouter de nombreuses launchctl
commandes à l'intérieur du <string></string>
bloc.
L' plist
activera après le redémarrage du système. Vous pouvez également l'utiliser launchctl load ~/Library/LaunchAgents/environment.plist
pour le lancer immédiatement.
[Éditer]
La même solution fonctionne également à El Capitan.
Xcode 7.0+ n'évalue pas les variables d'environnement par défaut. L'ancien comportement peut être activé avec cette commande:
defaults write com.apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO
[Éditer]
Il y a quelques situations où cela ne fonctionne pas tout à fait. Si l'ordinateur est redémarré et que "Rouvrir les fenêtres lors de la reconnexion" est sélectionné, les fenêtres rouvertes risquent de ne pas voir les variables (elles sont peut-être ouvertes avant l'exécution de l'agent). De plus, si vous vous connectez via ssh, les variables ne seront pas définies (vous devrez donc les définir dans ~ / .bash_profile). Enfin, cela ne semble pas fonctionner pour PATH sur El Capitan et Sierra. Cela doit être défini via 'launchctl config user path ...' et dans / etc / chemins.
UseSanitizedBuildSystemEnvironment
).
[ Réponse originale ]: Vous pouvez toujours utiliser launchctl setenv variablename value
pour définir une variable afin qu'elle soit captée par toutes les applications (applications graphiques démarrées via le Dock ou Spotlight, en plus de celles démarrées via le terminal).
Évidemment, vous ne voudrez pas faire cela à chaque fois que vous vous connectez.
[ Modifier ]: pour éviter cela, lancez AppleScript Editor
, entrez une commande comme celle-ci:
do shell script "launchctl setenv variablename value"
(Utilisez plusieurs lignes si vous souhaitez définir plusieurs variables)
Maintenant, enregistrez (⌘
+ s
) comme Format de fichier: Application . Enfin, ouvrez System Settings
→ Utilisateurs et groupes → Éléments de connexion et ajoutez votre nouvelle application.
[ Réponse originale ]: Pour contourner toutes les variables que vous souhaitez définir dans un court script shell, jetez un œil à cette réponse précédente sur la façon d'exécuter un script sur la connexion MacOS . De cette façon, le script sera appelé lorsque l'utilisateur se connectera.
[ Modifier ]: Aucune des deux solutions n'est parfaite car les variables ne seront définies que pour cet utilisateur spécifique, mais j'espère / devine que cela peut être tout ce dont vous avez besoin.
Si vous avez plusieurs utilisateurs, vous pouvez soit définir manuellement un élément de connexion pour chacun d'eux, soit placer une copie de com.user.loginscript.plist dans chacun de leurs répertoires Library / LaunchAgents locaux , en pointant sur le même script shell.
Certes, aucune de ces solutions de contournement n'est aussi pratique que /etc/launchd.conf .
[ Modification supplémentaire ]: Un utilisateur ci-dessous mentionne que cela n'a pas fonctionné pour lui. Cependant, j'ai testé sur plusieurs machines Yosemite et cela fonctionne pour moi. Si vous rencontrez un problème, n'oubliez pas que vous devrez redémarrer les applications pour que cela prenne effet. De plus, si vous définissez des variables dans le terminal via ~ / .profile ou ~ / .bash_profile , elles remplaceront les éléments définis via launchctl setenv pour les applications démarrées depuis le shell .
Il est possible de définir des variables d'environnement sur Mac OS X 10.10 Yosemite avec 3 fichiers + 2 commandes.
Fichier principal avec définition des variables d'environnement:
$ 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"
Définition de service pour charger des variables d'environnement pour les applications utilisateur (terminal, 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
<?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>environment.user</string>
<key>ProgramArguments</key>
<array>
<string>/etc/environment</string>
</array>
<key>KeepAlive</key>
<false/>
<key>RunAtLoad</key>
<true/>
<key>WatchPaths</key>
<array>
<string>/etc/environment</string>
</array>
</dict>
</plist>
La même définition de service pour les applications utilisateur 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
<?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>environment</string>
<key>ProgramArguments</key>
<array>
<string>/etc/environment</string>
</array>
<key>KeepAlive</key>
<false/>
<key>RunAtLoad</key>
<true/>
<key>WatchPaths</key>
<array>
<string>/etc/environment</string>
</array>
</dict>
</plist>
Et enfin, nous devrions enregistrer ces services:
$ launchctl load -w /Library/LaunchAgents/environment.user.plist
$ sudo launchctl load -w /Library/LaunchDaemons/environment.plist
Ce que nous obtenons:
Problèmes / problèmes:
Pour que vos variables d'environnement soient correctement prises par les applications après le redémarrage du système, vous aurez besoin de:
Cela se produit parce qu'Apple refuse l'ordre explicite des services chargés, de sorte que les variables env sont enregistrées en parallèle avec le traitement de la "file d'attente de réouverture".
Mais en fait, je ne redémarre mon système que plusieurs fois par an (sur de grosses mises à jour), donc ce n'est pas un gros problème.
JAVA_HOME
), mais pas pour la PATH
variable (voir ma question sur demander différent ).
launchd
, mais ne serait-il pas possible de charger ces démons au démarrage (c'est-à-dire avant la connexion)? Cela devrait contourner tous les problèmes que vous mentionnez.
Cité de
Apple Developer Relations
10-Oct-2014 09:12 PM
Après de longues délibérations, l'ingénierie a supprimé cette fonctionnalité. Le fichier a
/etc/launchd.conf
été supprimé intentionnellement pour des raisons de sécurité. Pour contourner ce problème, vous pouvez exécuterlaunchctl limit
tant que root au début du démarrage, peut-être à partir d'un fichierLaunchDaemon
. (...)
Solution:
Mettez le code dans
/Library/LaunchDaemons/com.apple.launchd.limit.plist
par bash-script:
#!/bin/bash
echo '<?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>eicar</string>
<key>ProgramArguments</key>
<array>
<string>/bin/launchctl</string>
<string>limit</string>
<string>core</string>
<string>unlimited</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>' | sudo tee /Library/LaunchDaemons/com.apple.launchd.limit.plist
/Library/LaunchDaemons
, et au lieu de dire launchctl
d'exécuter la limit
commande, dites-lui d'exécuter la setenv
commande avec PATH
et une chaîne de chemin comme arguments. launchd
devrait le récupérer automatiquement au démarrage et être en quelque sorte auto-modifié presque immédiatement.
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
Voici les commandes pour restaurer l'ancien comportement:
# 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 '<?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>launchd.conf</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>-c</string>
<string>/usr/local/bin/launchd.conf.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
' > /Library/LaunchAgents/launchd.conf.plist
Vous pouvez maintenant spécifier des commandes comme setenv JAVA_HOME /Library/Java/Home
dans/etc/launchd.conf
.
Vérifié sur El Capitan.
Qu'est-ce qui a fonctionné pour moi (inspiré de merci aax):
Collez-le dans /Library/LaunchDaemons/com.apple.launchd.limit.plist puis redémarrez:
<?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>eicar</string>
<key>ProgramArguments</key>
<array>
<string>/bin/launchctl</string>
<string>limit</string>
<string>maxfiles</string>
<string>16384</string>
<string>16384</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>
Si vous en avez besoin étape par étape:
⌘+v
). Cela forcera la limite à 16384 fichiers par processus et 16384 fichiers au totalesc
puis:wq
J'espère que cela vous a aidé.
Vous pouvez essayer https://github.com/ersiner/osx-env-sync . Il gère à la fois les applications de ligne de commande et d'interface graphique à partir d'une seule source et fonctionne avec la dernière version d'OS X (Yosemite).
Vous pouvez utiliser des substitutions de chemin et d'autres astuces de shell puisque ce que vous écrivez est un script bash normal qui doit être obtenu par bash en premier lieu. Aucune restriction. (Consultez la documentation osx-env-sync et vous comprendrez comment il y parvient.)
J'ai répondu à une question similaire ici où vous en trouverez plus.
La solution consiste à ajouter votre variable à /etc/profile
. Ensuite, tout fonctionne comme prévu! Bien sûr, vous DEVEZ le faire en tant qu'utilisateur root avec sudo nano / etc / profile. Si vous le modifiez d'une autre manière, le système se plaindra d'un / etc / profile endommagé, même si vous changez les permissions en root.
J'ai ajouté les variables dans le ~ / .bash_profile de la manière suivante. Une fois que vous avez terminé, redémarrez / déconnectez-vous et connectez-vous
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
REMARQUE: sans redémarrage / déconnexion et connexion, vous pouvez appliquer ces modifications en utilisant;
source ~/.bash_profile