OSXのPATH問題をMavericksリリースまで整理した後、問題はYosemiteに戻ってきました!!!
そこでlaunch.conf、Carbon EmacsやRStudioなどの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_HOMEとENVIRONMENT_RCに応じて設定されているenvironment.rcが、PATHに設定されて
/ usr / bin:/ bin
確認するためbashに、現在の環境の変数を表示するために(付録でも)代わりに小さなpythonスクリプトを作成した方法でinitファイルが取得されないため、Platypusラッパーをダブルクリックしてこれを直接実行します。再び新しい変数が設定されますが、PATHにはシステムのデフォルトがあります。
では、なぜ他の変数を設定できますが、PATH変数は設定できないのですか?そして、どうすればこれを統一的な方法で解決できますか?
更新:
状況は非常に不可解です:bashターミナルまたはEmacs のシェル(少なくとも)はを介して設定したPATHを取得しますlaunchctlが、他のGUIアプリはそれを実行しません。道。そして、Emacs自身でさえ正しいPATHを知りません。たとえば、Emacsコマンドを発行すると、これに気づきますM-x ispell-buffer。ispellemacsが呼び出そうとする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)
/usr/libexec/path_helperます。GUIアプリはPATHを取得しません/etc/paths-と私は特にGUIアプリについて尋ねました。