GUIアプリケーション用にOS Xで環境変数を設定する


18

〜/ .MacOSX / environment.plistまたはLogin Hooks(これらは非推奨であるため)を使用せずにGUIアプリケーションで使用できるように、Mac OS Xで環境変数を設定するにはどうすればよいですか?


@ ersin-er StackOverflowからの回答「単一ソースからのコマンドラインとGUIアプリの両方のソリューション(Yosemite&El Capitanで動作)」は、この質問を見つけた人にとって興味深いかもしれません。
l --marc l

回答:


16

マウンテンライオンのすべて/etc/paths/etc/launchd.conf編集あらゆる有効になりません!

Appleの開発者フォーラムはこう言っています:

「.app自体のInfo.plistを変更して、必要な環境変数を含む「LSEnvironment」辞書を含めます。

〜/ .MacOSX / environment.plistはサポートされなくなりました。 "

そのため、アプリを直接編集しましたInfo.plist(「AppName.app」(この場合はSourceTree)を右クリックしてから、「Show package contents」)

パッケージの内容を表示

と呼ばれる新しいキー/辞書ペアを追加しました:

<key>LSEnvironment</key>
<dict>
     <key>PATH</key>
     <string>/Users/flori/.rvm/gems/ruby-1.9.3-p362/bin:/Users/flori/.rvm/gems/ruby-1.9.3-p362@global/bin:/Users/flori/.rvm/rubies/ruby-1.9.3-p326/bin:/Users/flori/.rvm/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:</string>
</dict>

(参照:AppleのLaunchServicesKeysドキュメント

ここに画像の説明を入力してください

現在、アプリ(私の場合はSourceTree)は指定されたパスを使用し、git 1.9.3で動作します:-)

PS:もちろん、特定のパスのニーズに合わせてパスエントリを調整する必要があります。


1
ありがとうございました!これは私にとって完璧でした。10.11(El Capitan)では、変更を有効にするために、Matthew提供するコマンドも実行するInfo.plist必要がありました。
dsedivec

8

このソリューションでは、の機能を起動エージェントlaunchctl組み合わせて、古いログインフックを模倣します。のストアを使用する他のソリューションについては、この比較を参照してください。ここで使用される起動エージェントは/ Library / LaunchAgents /にあります。launchd

<?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>user.conf.launchd</string>
    <key>Program</key>
    <string>/Users/Shared/conflaunchd.sh</string>
    <key>ProgramArguments</key>
    <array>
        <string>~/.conf.launchd</string>
    </array>
    <key>EnableGlobbing</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>
    <key>LimitLoadToSessionType</key>
    <array>
        <string>Aqua</string>
        <string>StandardIO</string>
    </array>
</dict>
</plist>

1つの重要なことはRunAtLoadキーです。これにより、可能な限り早い時間に起動エージェントが実行されます。実際の作業は、シェルスクリプト/Users/Shared/conflaunchd.shで行われます。このスクリプトは、〜/ .conf.launchdを読み取り、以下に送りますlaunchctl

#! /bin/bash

#filename="$1"
filename="$HOME/.conf.launchd"

if [ ! -r "$filename" ]; then
    exit
fi

eval $(/usr/libexec/path_helper -s)

while read line; do
    # skip lines that only contain whitespace or a comment
    if [ ! -n "$line" -o `expr "$line" : '#'` -gt 0 ]; then continue; fi

    eval launchctl $line
done <"$filename"

exit 0

PATHを正しく設定path_helperするための呼び出しに注意してください。最後に、〜/ .conf.launchdは次のようになります

setenv PATH ~/Applications:"${PATH}"

setenv TEXINPUTS .:~/Documents/texmf//:
setenv BIBINPUTS .:~/Documents/texmf/bibtex//:
setenv BSTINPUTS .:~/Documents/texmf/bibtex//:

# Locale
setenv LANG en_US.UTF-8

これらはlaunchctlコマンドです。詳細については、マンページを参照してください。私にとってはうまく動作します(私はまだSnow Leopardの男だと言う必要があります)。texstudioTeXShopなどのGUIアプリケーションは、自分のtexツリーを見ることができます。改善できるもの:

  1. シェルスクリプトを持っている#filename="$1"ことに。これは偶然ではありません。ファイル名は、起動エージェントによって引数としてスクリプトに入力される必要がありますが、機能しません。

  2. ここで述べたよう(ドイツ語およびペイウォールの背後に!)、起動エージェント自体にスクリプトを配置することができます。

  3. evalユーザー提供の文字列を使用するため、このソリューションがどれほど安全かはわかりません。

  4. この方法を使用したMANPATHの定義はうまく機能しなかったことを覚えていると思いますが、よくわかりません。

Appleは、〜/ launchd.confに何かを置くことでやや似たアプローチを意図したことを言及する必要がありますが、現在この日付とOSについてはサポートされていません(のマンページを参照launchd.conf)。グロビングのようなものは、この提案のようには機能しないと思います。そしてもちろん、これらのファイルは、/ Library / LaunchAgents /または〜/ Library / LaunchAgents /に存在する必要がある起動エージェントを除いて、他の場所に置くことができます。

最後に、私が起動エージェントに関する情報として使用源に言及すべきである: 1234

更新:これは現在バージョン10.8では機能しません。アプリケーションごとの回避策については、ここここで説明します


ちなみに、ターミナル環境でPATH変数を定義し、この起動エージェントを使用する場合はexport PATH=.:"$(launchctl getenv PATH)"、〜/ .bash_profile(他のシェルでも同様)で記述することをお勧めします。これはpath_helperシェルスクリプトで呼び出されるため可能です。OS XのPATH変数の詳細については、この回答を確認してください。
パーシバルユリシーズ

3

@floriが提供する答えは、plistファイルを変更した後にTerminalで次のコマンドを実行すると、Maverickで機能します。

/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user 

killall Finder

私はエルキャピタンと同じ行動をしました。@ floriの答えにあなたのポイントを追加しました

2

@ percival-ulyssesが提供する答えは、10.9 Mavericksで次の小さな変更を加えて動作します:/Users/Shared/conflaunchd.shスクリプトを直前に編集しexit 0て行を追加します

killall Dock
killall SystemUIServer

Dockとメニューバーを再起動します。この後、DockまたはSpotlightから起動されたアプリケーションは正しいPATHを継承します。Finderを使用してPATHクリティカルなアプリケーションを起動するkillall Finder場合は、追加することもできます。

.bash_profile私はラインを使用します

export PATH=`launchctl getenv PATH`

ターミナルのPATHを設定するには、この方法でPATHを同じ場所である〜/ .conf.launchdファイルから制御します。


0

別のオプションはを使用すること/etc/launchd.confです。たとえばPATH、次の行を追加してデフォルトを変更しました/etc/launchd.conf

setenv PATH ~/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/libexec:/usr/texbin

変更を適用するには/etc/launchd.conflaunchctl < /etc/launchd.conf; sudo launchctl < /etc/launchd.confプロセスを再起動するか、プロセスを実行および終了して再起動します。

の設定は/etc/launchd.conf、ルートのlaunchdプロセスとユーザーごとのlaunchdプロセスの両方に適用されます。setenvinで設定された環境変数/etc/launchd.confは、sudo launchctl exportとの両方で表示されlaunchctl exportます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.