環境変数を設定できる場所がいくつかあります。
~/.profile
: ターミナルから起動されるすべてのプログラムで設定する変数にこれを使用します (Linux とは異なり、Terminal.app で開かれるすべてのシェルはログイン シェルであることに注意してください)。
~/.bashrc
: これは、ログイン シェルではないシェルに対して呼び出されます。これは、継承された環境変数ではなく、サブシェルで再定義する必要があるエイリアスやその他のものに使用します。
/etc/profile
: これは ~/.profile の前にロードされますが、それ以外は同等です。マシン上のすべてのユーザーが起動する端末プログラムに変数を適用する場合に使用します (ユーザーが bash を使用していると仮定します)。
~/.MacOSX/environment.plist
: これは、ログイン時に loginwindow によって読み取られます。これは、10.5 (10.6 ではない) で Spotlight によって起動されるものを除き、GUI を含むすべてのアプリケーションに適用されます。変更を有効にするには、ログアウトしてから再度ログインする必要があります。このファイルは、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
では、変数を使用する GUI アプリを起動してください。
~/.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 < ~/.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"
。
また、ログイン時に実行される他のプログラムは、launchagent の前に実行される可能性があるため、設定された環境変数が表示されない場合があることに注意してください。