launchd.confを介して環境変数を設定すると、OS X Yosemite / El Capitan / macOS Sierra / Mojaveで機能しなくなりますか?


189

launchd.confは私の環境変数をもうロードしないようです。他の誰かがそれに気づいたことがありますか?

環境変数を永続的に設定する別の解決策はありますか?


これは機能し、アプリケーションでは利用できますが、ターミナルでは利用できません
Chang Zhao

回答:


158

次の内容で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>

ブロックlaunchctl内に多くのコマンドを追加できます<string></string>

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で設定する必要があります。


20
再起動する必要はありません!「launchctl start environment.plist」を実行して、新しい環境変数を取得するために必要なアプリを再起動できます;)
hasvn

1
これは、PATH変数では機能しません。したがって、他の変数を設定するためのこのアプローチに加えて、〜/ .bash_profileにPATH変数を設定します。これはすべてのケースでうまくいくわけではないかもしれませんが、今のところ問題はありません。
djule5 2014

6
それを考え出し:動作するように、再起動せずに、それは「launchctlをする必要があります負荷ではない、environment.plist」開始
デイブHartnoll

2
ああ、そうです。インターネット全体(google UseSanitizedBuildSystemEnvironment)で正確に9回表示されるあいまいな構成設定のようなものはありません。
Ohad Schneider、

2
シエラでも
動作

64

[ 元の回答 ]:すべてのアプリケーション(ターミナル経由で開始されたものに加えて、DockまたはSpotlight経由で開始launchctl setenv variablename valueされたグラフィックアプリケーション)によって取得されるように変数を設定するために引き続き使用できます。

当然、ログインするたびにこれを行う必要はありません。

[ 編集 ]:これを回避するには、を起動してAppleScript Editor、次のようなコマンドを入力します。

do shell script "launchctl setenv variablename value"

(複数の変数を設定する場合は、複数行を使用してください)

+ s)をFile format:Applicationとして保存します。最後にSystem Settingsユーザーとグループログイン項目を開き、新しいアプリケーションを追加します。

[ 元の回答 ]:この場所を回避するには、定義するすべての変数を短いシェルスクリプトで定義し、MacOSログインでスクリプトを実行する方法について以前の回答をご覧ください。これにより、ユーザーがログインしたときにスクリプトが呼び出されます。

[ 編集 ]:変数はその特定のユーザーに対してのみ設定されるため、どちらのソリューションも完璧ではありませんが、必要なのはそれだけでよいのではないかと思っています。

複数のユーザーがいる場合は、ユーザーごとにログイン項目を手動で設定するか、com.user.loginscript.plistのコピーを各ローカルのLibrary / LaunchAgentsディレクトリに配置して、同じシェルスクリプトを指すようにします。

確かに、これらの回避策はどちらも/etc/launchd.confほど便利ではありません

[ さらに編集 ]:以下のユーザーは、これが彼にとってうまくいかなかったと述べています。しかし、私は複数のヨセミテマシンでテストしましたが、それは私にとってはうまくいきます。問題がある場合は、これを有効にするためにアプリケーションを再起動する必要があることに注意してください。さらに、〜/ .profileまたは〜/ .bash_profileを介して端末で変数を設定すると、シェルから起動されたアプリケーションのlaunchctl setenvを介して設定されたものを上書きします。


5
私の知る限り、この手法の欠点の1つは、ログイン時に開始される他のアプリケーションに対して変数が設定されないことです。たとえば、ターミナルを開いた場合、変数は設定されますが、ログオフして再度ログオンした場合、ターミナルが自動的に再起動すると、変数は設定解除されます...
JasonD

私はこの解決策を試しましたが、うまくいきませんでした。ただし、Java IDE(IntelliJ)がパスの変更を取得することを特に期待していますが、そうではありません。ターミナルからすべてうまくいきます。IntelliJのバグの可能性があります。Appleがこの機能を削除したことにまだ苛立たしい。私はAppleに電話をかけましたが、あまり役に立ちませんでした。
Jason

これは私にとってはうまくいきますが、環境変数をsudoに追加する方法を知っていますか?
etiennenoel 14

2
これは一般的には機能しますが、Yosemite(少なくとも10.10.0および10.10.1)には、$ PATHの設定がこのように機能しないというバグがあります。Appleはこのバグを認識しています。現在(10.10.1)、GUIアプリにシステム全体の$ PATHを設定する既知の方法はありません。
TJ Luoma 14

3
上記の方法のいずれかを使用してラップトップを再起動した後-アプリケーション(iTerm、ターミナル、Eclipse、IDEAなど、使用しているものなど)を明示的に再度開いてください。明示的に再起動しない場合、およびOSxの再起動中にチェックボックスが「再ログイン時にウィンドウを再起動する」にチェックされている場合(デフォルト)-これらのプログラムは新しい環境変数を読み取りません。

21

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

私たちが得るもの:

  1. システム環境変数を宣言する唯一の場所:/ etc / environment
  2. / etc / environmentファイルの変更後の環境変数の即時自動更新-アプリケーションを再起動するだけ

問題/問題:

システムの再起動後にアプリケーションが環境変数を正しく取得するには、次のものが必要です。

  • どちらか2回ログイン:ログイン=>ログアウト=>ログイン
  • または環境変数を取得する必要があるアプリケーションを手動で閉じて再度開く
  • または、「ログバック時にウィンドウを再度開く」機能を使用しないでください。

これは、ロードされたサービスの明示的な順序付けをAppleが拒否するために発生するため、「再オープンキュー」の処理と並行して環境変数が登録されます。

しかし、実際には、システムを再起動するのは年に数回(大きなアップデートの場合)だけなので、大したことではありません。


いい案。私はそれを試してみましたが、ほとんどの環境変数(などJAVA_HOME)で機能しますが、PATH変数では機能しません(ask differentに関する私の質問を参照しください)。
Halloleo 2014年

4
PATHは/ etc / pathsファイルで設定する必要があります。このファイルの最後にカスタムパスを追加するだけです。
ursa 2014年

私はに慣れていませんがlaunchd、ブート時に(つまり、ログイン前に)これらのデーモンをロードすることはできませんか?それはあなたが言及するすべての問題を回避するはずです。
エゴン

私は上記のアプローチが好きですが、管理するのに奇妙な問題があります。再起動後、genet VARNAMEは正しい値を返しますが、echo $ VARNAMEは何も返しません。これの理由は何でしょうか?私はそれをstackoverflow.com/questions/27045137/…にも投稿し、ここの誰もがアイデアを持っていることを願っています
ctp

/ etc / environmentのファイル権限が上記のとおりであることを確認してください。
imanuelcostigan 14

6

から引用

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

多くの検討の後、エンジニアリングはこの機能を削除しました。ファイル/etc/launchd.confはセキュリティ上の理由から意図的に削除されました。回避策として、launchctl limit起動時に、おそらくからrootとして実行することができますLaunchDaemon。(...)

解決:

/Library/LaunchDaemons/com.apple.launchd.limit.plistbash-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

1
これについてもう少し説明できますか?「問題の解決」が最初の問題とどのように関連しているかわかりません!
Nick H247 2014年

OPではありませんが、ここでの要点は次のとおりです。このplistを/Library/LaunchDaemonsに入れlaunchctllimitコマンドを実行するように指示する代わりに、引数としてパス文字列とsetenvコマンドを実行するように指示しPATHます。 launchd起動時に自動的に取得し、ほぼ即座に一種の自己修正されます。
Laird Nelson

5
xmlは不完全にコピーされます。doctype行は次のようになります<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
UloPe 2014年

6
@aaxそのplistのどの部分が実際に環境変数を設定しますか?
HairOfTheDog 14年

3

古い動作を復元するコマンドは次のとおりです。

# 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で確認しました。


2

私にとって何がうまくいきましたか(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>

段階的に必要な場合:

  • 端末を起動
  • タイプはsudo suが、ルートとしてログインし、パスワードを入力してください
  • vi /Library/LaunchDaemons/com.apple.launchd.limit.plist」と入力します
  • viエディターに入ったら、キーiを押して挿入モードに入り、上記の正確なコード内容を貼り付けます(⌘+v)。これにより、プロセスごとに16384ファイルおよび合計16384ファイルに制限が強制されます。
  • あなたのファイルを保存し、使用して終了しescた後:wq
  • システムを再起動し、launchctl limitコマンドを使用してシステムが機能していることを確認します

これがお役に立てば幸いです。


10
このソリューションは環境変数の設定とどのように関係していますか?
HairOfTheDog 14年

2

https://github.com/ersiner/osx-env-syncを試すことができますコマンドラインとGUIアプリの両方を単一のソースから処理し、最新バージョンのOS X(Yosemite)で動作します。

最初にbashをソースとする通常のbashスクリプトなので、パス置換やその他のシェルトリックを使用できます。制限なし..(osx-env-syncのドキュメントを確認すると、これがどのように行われるかを理解できます。)

詳細については、ここで同様の質問に回答しました。


-3

解決策は、変数をに追加すること/etc/profileです。その後、すべてが期待どおりに動作します!もちろん、sudo nano / etc / profileでrootユーザーとして実行する必要があります。他の方法で編集すると、権限をrootに変更した場合でも、システムは/ etc / profileの損傷を訴えます。


7
環境変数をプロファイルに追加することは、シェルプロセスにのみ影響するため、非常に劣ります。
UloPe 2014年

-5

以下の方法で〜/ .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

ログアウトして再度ログインする必要はありません。ソースコマンド、つまりsource .bash_profileを使用してください。
Michael

2
また、このメソッドの問題は、環境変数が使用可能になる前に、ターミナルを開く必要があることです。ターミナルを開かなくても利用できるように、最初の回答の内容を実行することをお勧めします。
Michael

1
これはSpotLight経由でロードされたアプリでは機能しません。stackoverflow.com/questions/135688/...
Rasikaペレラ

1
bash設定ファイルを使用することは、常にbashが常に、自分が実行しようとしている環境のプロセスの祖先であることを前提としているため、制限された助けになります。Spotlight、ファインダー、emacs、xcode、cronjobs、launchdエージェント、任意のIDE、ソース管理ブラウザーなどはすべて、祖先としてbashを持つことはありません。これらを一貫してカバーできる唯一のプロセスが起動されます。
ベン・ハイド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.