launchd.conf
が私の環境変数をもう読み込まないようです。他の誰かがそれに気づいたことがありますか?
環境変数を恒久的に設定するための別の解決策はありますか?
この内容でenvironment.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>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>
<string></string>
ブロック内にlaunchctl
コマンドを多数追加できます。
plist
はシステムの再起動後にアクティブになります。 launchctl load ~/Library/LaunchAgents/environment.plist
を使ってすぐに起動することもできます。
[編集]
同じ解決策がEl Capitanでも機能します。
Xcode 7.0以降は、デフォルトでは環境変数を評価しません。このコマンドで以前の動作を有効にすることができます。
defaults write com.Apple.dt.Xcode UseSanitizedBuildSystemEnvironment -bool NO
[編集]
これではうまくいかない場合がいくつかあります。コンピュータが再起動され、[ログイン時にウィンドウを再度開く]が選択されていると、再起動されたウィンドウに変数が表示されないことがあります(おそらくエージェントが実行される前に開かれます)。また、ssh経由でログインした場合、変数は設定されません(したがって、〜/ .bash_profileに設定する必要があります)。最後に、これはEl CapitanとSierraのPATHにはうまくいかないようです。これは 'launchctl config user path ...'と/ etc/pathsで設定する必要があります。
[ Original answer ]:launchctl setenv variablename value
を使用して変数を設定し、 all applications(グラフィカルアプリケーションは次の方法で起動できます)ターミナル経由で起動したものに加えて、DockまたはSpotlight。
明らかに、ログインするたびにこれをしたくないでしょう。
[ Edit ]:これを回避するには、AppleScript Editor
を起動し、次のようなコマンドを入力してください。
do Shell script "launchctl setenv variablename value"
(複数の変数を設定したい場合は複数行を使用してください)
(⌘
+ s
)をファイル形式として保存します。アプリケーション。最後にSystem Settings
→ユーザーとグループ→ログイン項目を開き、新しいアプリケーションを追加します。
[元の答え]:この場所を回避するには、短いシェルスクリプトで定義したいすべての変数を使用し、次にこれを見てください MacOSログインでスクリプトを実行する方法についての回答 。そうすれば、ユーザがログインしたときにスクリプトが呼び出されます。
[ Edit ]:変数はその特定のユーザーに対してのみ設定されるので、どちらの解決策も完璧ではありませんが、すべてがうまくいくことを願っています/推測しています必要です。
複数のユーザーがいる場合は、それぞれに手動でログイン項目を設定するか、またはcom.user.loginscript.plistのコピーを配置します。それぞれのローカルLibrary/LaunchAgentsディレクトリで、同じシェルスクリプトを指しています。
もちろん、これらの回避策はどちらも/ etc/launchd.confほど便利ではありません。
[さらに編集]:下のユーザーは、これは彼にとってうまくいかなかったと述べています。しかし、私は複数のYosemiteマシンでテストしてきました、そしてそれは私のために働きます。問題がある場合は、これを有効にするためにアプリケーションを再起動する必要があります。さらに、〜/ .profileまたは〜/ .bash_profileで端末に変数を設定すると、で設定したものが上書きされます。 アプリケーション用のlaunchctl setenvは、Shell から開始されました。
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
<?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>
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>
そして最後にこれらのサービスを登録する必要があります:
$ launchctl load -w /Library/LaunchAgents/environment.user.plist
$ Sudo launchctl load -w /Library/LaunchDaemons/environment.plist
得られるもの:
問題点/問題点:
あなたのenv変数がアプリケーションによって正しくとられるためにはシステムの再起動後にが必要になるでしょう:
これはAppleがロードされたサービスの明示的な順序付けを否定しているために起こります。そのためenv変数は "reopenキュー"の処理と並行して登録されます。
しかし実際には、私は年に数回しかシステムをリブートしません(大きなアップデートで)ので、それは大したことではありません。
から引用
Apple Developer Relations 10-Oct-2014 09:12 PM
多くの検討の末、エンジニアリングはこの機能を削除しました。セキュリティ上の理由から、ファイル
/etc/launchd.conf
は意図的に削除されました。回避策として、起動時の早い段階で、おそらくLaunchDaemon
からlaunchctl limit
をrootとして実行することができます。 (...)
溶液:
Bash-scriptでコードを
/Library/LaunchDaemons/com.Apple.launchd.limit.plist
に入れます。
#!/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
これは、以前の動作を復元するためのコマンドです。
# 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
これでsetenv Java_HOME /Library/Java/Home
に/etc/launchd.conf
のようなコマンドを指定できます。
El Capitanで確認しました。
私のために何がうまくいったのでしょう(aaxのおかげで)
これを/ Library/LaunchDaemons/com.Apple.launchd.limit.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>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>
ステップバイステップで必要な場合
⌘+v
)を貼り付けます。これにより、1プロセスあたり16384ファイル、合計16384ファイルに制限されます。esc
を使用して終了し、次に:wq
を使用して終了しますこれがお役に立てば幸いです。
あなたは https://github.com/ersiner/osx-env-sync 試してみることができます。 シングルソースからコマンドラインとGUIアプリケーションの両方を処理し、OS Xの最新バージョン(ヨセミテ)と一緒に動作します。
あなたが書いたものはそもそもbashによって供給される通常のbashスクリプトなので、パス置換や他のシェルトリックを使うことができます。制限はありません。( osx-env-sync ドキュメントを確認してください。これがどのように達成されるか理解できます。)
私は同様の質問に答えました here あなたがもっと見つけることができるところ。