OSX Yosemiteで、GUIアプリの多くの環境変数を設定できるのに、特定の変数PATHを設定できないのはなぜですか


16

OSXのPATH問題をMavericksリリースまで整理した後、問題はYosemiteに戻ってきました!!!

そこでlaunch.confCarbon EmacsRStudioなどのGUIアプリでPATH環境変数を使用できるようにするために、新しいMac OSX 10.10 Yosemiteリリースの古い機能を模倣したいと思います。stackoverflowユーザーursaの素晴らしいアイデアを使用して、を介して環境変数を設定するシェルスクリプトをセットアップしましたlaunchctl。(彼のstackoverflowの答えはこちらをご覧ください。)これはほとんどの環境変数で機能しますが、PATH変数では機能しません

1.私は何をしましたか?

最初に、次の /etc/environment.rcようなスクリプトを作成しました。

launchctl setenv PATH /Users/halloleo/bin:/usr/texbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
launchctl setenv JAVA_HOME /usr/local/jdk1.7
launchctl setenv ENVIRONMENT_RC "yes"

次に、launchd(これらのスクリプトおよび以下の付録に記載されている他のスクリプトのリスト用の)リストを作成しました。次に、それらをアクティブにしました

$ sudo launchctrl load ...

次にpath_helper、シェルの初期化ファイル/etc/プロファイルでユーティリティを無効にして、environment.rc設定が上書きされないようにしました。そして最後に、マシンを再起動しました。

2.効果は何ですか?

私は、新しい環境変数のターミナルを起動するとJAVA_HOMEENVIRONMENT_RCに応じて設定されているenvironment.rcが、PATHに設定されて

/ usr / bin:/ bin

確認するためbashに、現在の環境の変数を表示するために(付録でも)代わりに小さなpythonスクリプトを作成した方法でinitファイルが取得されないため、Platypusラッパーをダブルクリックしてこれを直接実行します。再び新しい変数が設定されますが、PATHにはシステムのデフォルトがあります。

では、なぜ他の変数を設定できますが、PATH変数設定できないのですか?そして、どうすればこれを統一的な方法で解決できますか?

更新:

状況は非常に不可解です:bashターミナルまたはEmacs のシェル(少なくとも)はを介して設定したPATHを取得しますlaunchctlが、他のGUIアプリはそれを実行しません。道。そして、Emacs自身でさえ正しいPATHを知りません。たとえば、Emacsコマンドを発行すると、これに気づきますM-x ispell-bufferispellemacsが呼び出そうとするUNIXツールは、カスタムパス上にあるだけでは見つかりません。


付録

net.halloleo.environment.plist、launchd構成ファイル/Library/LaunchDaemons/

<?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>KeepAlive</key>
    <false/>
    <key>Label</key>
    <string>net.halloleo.environment</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/etc/environment.rc</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment.rc</string>
    </array>
</dict>
</plist>

net.halloleo.environment-user.plist、launchd構成ファイル/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>KeepAlive</key>
    <false/>
    <key>Label</key>
    <string>net.halloleo.environment-user</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/etc/environment.rc</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>WatchPaths</key>
    <array>
        <string>/etc/environment.rc</string>
    </array>
</dict>
</plist>

/etc/profile、変更されたbash起動ファイル:

# System-wide .profile for sh(1)

# if [ -x /usr/libexec/path_helper ]; then
#   eval `/usr/libexec/path_helper -s`
# fi

if [ "${BASH-no}" != "no" ]; then
    [ -r /etc/bashrc ] && . /etc/bashrc
fi

show_environ.py、すべての環境変数を表示するスクリプト:

import os
print (os.environ)

回答:


3

YosemiteのPATHは、/ etc / pathsファイル内で設定できます。このファイルの最後にパスを追加するだけです:

/usr/bin
/bin
/your/custom/path

元の投稿の / etc / environmentスクリプトは、GUIアプリケーションでのPATH変数のサポートを提供します(Emacsでテスト済み)。


5
これは、初期化プロセス中に呼び出すシェルに対してのみ機能し/usr/libexec/path_helperます。GUIアプリはPATHを取得しませ/etc/paths -と私は特にGUIアプリについて尋ねました。
ハレレオ14年

私は、オリジナルのポストではと/ etc /環境スクリプトの答えを更新しました
URSA

これは、1つは、あなたが与えている2つの答えである-また、OPが言うに/ etc /環境は動作しません
user151019

@mark(1)この質問が上がった後、/ etc / environmentを更新しましたが、現在はPATHをサポートしています。(2)ここでの答えは、/ etc / pathsを使用することです
ursa 14年

2
@markはい、それがまさに私のポイント、問題、質問です:Finderから起動したときにGUIアプリ自体の環境変数PATHを設定するにはどうすればよいですか?それでも、本当の一般的な光景で、このためのソリューションません...
halloleo

2

これは私を長い間(まあ、最後の数時間)困惑させました。最後に、このバグレポートに出くわしました。これは私の問題を正確に説明しているようです(それがあなたの問題にどの程度関連しているかはわかりませんが、Yosemite / launchdにはPATHやスクリプトと組み合わせてバグがあるようです) Pythonとして:

http://www.openradar.me/18945659

解決策は、シェルスクリプトを起動してからPythonを起動することです。本当に私が好きなものではありませんが、それはそうです...


バグレポートへのリンクをありがとう。今のところ、それは本当のバグです。その周りに別のクラッチを見つけました。ここに投稿します。
ハレレオ

1

問題は、launchdが環境内のPATH変数を置き換える代わりに別のPATH変数を追加することです。ほとんどのプログラムはgetenvは、変数の最初の出現を常に返すものをします。代わりに、シェルはすべての環境変数を反復処理してローカル変数としてインポートし、前のインスタンスを最後のインスタンスで上書きします。

これは明らかにlaunchdのバグであり、プログラムに渡される環境変数は一意でなければなりません。


1
クールな背景の答え!私は、シェルでそれを回避する本当の方法ではないと思いますか?
ハレレオ

@halloleo sh -c 'YOUR ORIGINAL COMMAND'シェルを介して渡すコマンドを起動し、PATHlaunchdでセットを選択できます。
StenSoft
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.