macOSでlaunchctlを使ってアプリの環境変数を設定する

BashやZshなどのシェルで環境変数を設定することはよくあると思います。

シェルではなくアプリで環境変数を使いたいと思ったことはないですか?私はとあることで必要にせまれて調べたところ launchctl コマンドを使えばアプリで環境変数を使うことができることがわかりました。

launchctlコマンド

環境変数を設定する方法です。

launchctl setenv [キー] [値]

設定された環境変数は次の方法で確認することができます。

launchctl getenv [キー] 

なお、launchctlコマンドは masOS10.10(Yosemite) 以降で使うことができます。

再起動しても反映されるようにする

launchctlコマンドで設定した環境変数は再起動すると削除されてしまいます。 .bash_profile などに書くように再起動しても反映されるようにしたいものです。

システムの起動時に、コンピュータをセットアップするためにカーネルによって実行される最初のプロセスである launchd を利用することで解決することができます。

次のようなplistファイルを用意します。ここでは apikeys.environment.plist という名前にし、 MAPS_API_KEY という名前で 123456789abc という値を設定しています。

<?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>
    <!-- Labelの値は何でも良いがファイル名と同じにする -->
    <string>apikeys.environment</string>
    <key>ProgramArguments</key>
    <array>
      <string>/bin/launchctl</string>
      <string>setenv</string>
      <!-- キー -->
      <string>MAPS_API_KEY</string>
      <!-- 値 -->
      <string>123456789abc</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
  </dict>
</plist>

このファイルを次の位置に配置します。

  • 全ユーザに環境変数を適用したい場合: /Library/LaunchAgents/
  • 1ユーザのみに環境変数を適用したい場合: ~/Library/LaunchAgents/

これで再起動しても環境変数が設定されるようになります。

※launchdについては詳しくはApple公式を参照してください。