OS Xでの環境変数の設定


849

OS XでPATHなどの環境変数を変更する適切な方法は何ですか?

私はGoogleを少し調べて、編集する3つの異なるファイルを見つけました。

  • / etc / paths
  • 〜/ .profile
  • 〜/ .tcshrc

OS Xはbashを使用しているので、これらのファイルの一部もありません。.tcshrcが間違っていることは確かです。これらの変数、特にPATHはどこで定義されていますか?

OS X v10.5(Leopard)を実行しています。


env "switch.1.disabled=true" open -n /Applications/Eclipse.app/新しいセットのシステム環境でGUIアプリケーションを起動します。
香港

回答:


652

ブルーノは順調です。私は広範囲にわたる調査を行ったので、すべてのGUIアプリケーションで使用可能な変数を設定したい場合、唯一のオプションは/etc/launchd.confです。

Spotlight経由で起動したアプリケーションではenvironment.plistは機能しないことに注意してくださいこれはスティーブセクストンによってここに文書化されています

  1. 端末プロンプトを開く

  2. タイプsudo vi /etc/launchd.conf(注:このファイルはまだ存在していない可能性があります)

  3. 次のような内容をファイルに入れます

    # Set environment variables here so they are available globally to all apps
    # (and Terminal), including those launched via Spotlight.
    #
    # After editing this file run the following command from the terminal to update
    # environment variables globally without needing to reboot.
    # NOTE: You will still need to restart the relevant application (including
    # Terminal) to pick up the changes!
    # grep -E "^setenv" /etc/launchd.conf | xargs -t -L 1 launchctl
    #
    # See http://www.digitaledgesw.com/node/31
    # and http://stackoverflow.com/questions/135688/setting-environment-variables-in-os-x/
    #
    # Note that you must hardcode the paths below, don't use environment variables.
    # You also need to surround multiple values in quotes, see MAVEN_OPTS example below.
    #
    setenv JAVA_VERSION 1.6
    setenv JAVA_HOME /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
    setenv GROOVY_HOME /Applications/Dev/groovy
    setenv GRAILS_HOME /Applications/Dev/grails
    setenv NEXUS_HOME /Applications/Dev/nexus/nexus-webapp
    setenv JRUBY_HOME /Applications/Dev/jruby
    
    setenv ANT_HOME /Applications/Dev/apache-ant
    setenv ANT_OPTS -Xmx512M
    
    setenv MAVEN_OPTS "-Xmx1024M -XX:MaxPermSize=512m"
    setenv M2_HOME /Applications/Dev/apache-maven
    
    setenv JMETER_HOME /Applications/Dev/jakarta-jmeter
  4. viで変更を保存し、Macを再起動します。または、上記のコードコメントに示されているgrep/ xargsコマンドを使用します。

  5. ターミナルウィンドウを開いて入力し、変数が機能していることを証明するexportと、新しい変数が表示されます。これらは、Spotlight経由で起動するIntelliJ IDEAおよびその他のGUIアプリケーションでも使用できます。


3
受け入れられた回答(environment.plist)は私にとって成功していないと言っています。4台のマシンの10.5と10.6でlaunchd.confアプローチを正常に使用しました。
Matthew McCullough、2010年

54
システムを再起動せずにこれ行う方法はありますか?
ソリン

40
上記の制限はMacOS X 10.5に適用されます。ただし、MacOS X 10.6にはこの制限がなくなり、environment.plist内の値の設定は、スポットライトを介して起動されたアプリでも正常に機能します。したがって、選択された答えはSnow Leopardに対して正しいです;-)
Louis Jacomet

5
設定launchd.confは1つの方法ですが、(launchdを再起動するために)再起動が必要です。再起動を避けたい場合は、私の回答を参照してください。stackoverflow.com/ questions / 135688
Matt Curtis

23
提示されたlaunchdアプローチにはいくつかの問題があります。ほとんどはPATH環境変数に固有ですが、質問者は特にPATHについて言及しました。1)launchd.confの項目は、sshなどの対話型シェルではシステムに適用されません。2)「setenv PATH / testdir」という行があると、Terminal.appのPATHに追加されますが、OS Xアプリケーションの環境にある他のすべてのPATH項目が削除されます。3)/etc/launchd.confで「setenv PATH $ {PATH}:/ testdir」を実行しても、既存の$ PATHが適切に展開されません4)launchd.confは、1人ではなくすべてのユーザーに適用されます。それより良いソルンがあるわけではない。
NoahR

257

Spotlightによって開始された新しいプロセスの環境を設定する方法(再起動する必要なし)

launchd(および拡張すると、Spotlightから開始されるものすべて)が使用する環境をで設定できlaunchctl setenvます。たとえば、パスを設定するには:

launchctl setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

または、パスをに設定する場合は.bashrc、launchdにミラーリングします。

PATH=/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
launchctl setenv PATH $PATH

再起動する必要はありません、あなたはそれが変更された環境をピックアップしたい場合はアプリを再起動する必要がありますけれどもが。

これには、すでにTerminal.appで実行されているすべてのシェルが含まれますが、そこにいる場合は、環境をより直接設定できます。 export PATH=/opt/local/bin:/opt/local/sbin:$PATH、bashやzshなどを使用て。

再起動後に変更を保持する方法

再起動後に変更保持するには/etc/launchd.conf、次のようにから環境変数を設定できます。

setenv PATH /opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

launchd.conf 再起動すると自動的に実行されます。

これらの変更を今すぐ有効にする場合は、このコマンドを使用して再処理する必要がありますlaunchctl.conf(@mklementに感謝します!)

egrep -v '^\s*#' /etc/launchd.conf | launchctl

コマンドでlaunchctlどのようにロードさlaunchd.confれるかについての詳細を知ることができますman launchctl


2
すごくいい!しかし、environment.plistを使用する利点は、OS Xが最初に端末を起動する必要なしに、そのファイルのコンテンツを尊重することです。とにかく、私はあなたの答えは主に再起動の必要性を回避することに集中したと思うので、そのためにthx。
fotNelton 2010

2
@kapuzineralexはい、再起動を回避しenvironment.plistます。また、Spotlightから開始されたプログラムの環境を変更しますが、変更しません。
Matt Curtis、

2
この方法で環境を設定しても、再起動するまで機能しました。Macを再起動した後、環境変数が持続しませんでした。マシューの答えは私には完璧に働きました。
Shamal Karunarathne、2011

8
@Shamal:私はあなたのコメントを+1しましたが、Matthewの回答に再起動が必要であることを覚えておいてください。両方が必要な場合は、パス設定をlaunchd.confに入れ(再起動後も維持されるようにする)、次のような「ソース/etc/launchctl.conf; launchctl setenv PATH $ PATH」のようなスクリプトを使用することをお勧めします。また、再起動したくないときに「更新」することもできます。
Matt Curtis、

5
@MattCurtis回答を直接編集して、再起動が不要であるにもかかわらず、再起動後に変更が実際に失われることを明確にしていただけませんか?また、etc/launchd.conf再起動前に変更を適用する正しい方法は、@ MatthewMcCulloughの答えのアプローチを使用することですegrep "^setenv\ " /etc/launchd.conf | xargs -t -L 1 launchctl
mklement0 2013年

106

含むまでとOS X v10.7用(ライオン)あなたがそれらを設定することができます。

~/.MacOSX/environment.plist

見る:

ターミナルのPATHについては、.bash_profileまたはで設定できるはず.profileです(ただし、作成する必要があります)。

以下のためのOS X v10.8の(マウンテンライオン)以降 使用する必要があるlaunchdlaunchctl


4
これは、実際にグラフィカルアプリで使用されることを期待している場合のみです。これらは通常、環境変数を使用しないため、設定するのに適した場所ではありません。
Chris Hanson、

18
環境変数を使用するグラフィカルアプリの非常に良い例がいくつかあります。たとえば、IntelliJは、M2_HOMEを見てMavenがどこに住んでいるかを知りたいと思っています。変数を表示するには、environment.plistの代わりに/etc/launchd.confに設定する必要があります。
マシューマッカロー

3
参考までにpreferences.plist、OS X 10.5ではpreferences.plist、スポットライトを介して起動されたアプリケーションについてはまだ読まれていなかったため、使用は理想的ではありませんでした。 /002113.html。OS X 10.6の場合、正常にenvironment.plist機能します。
Janus

16
これはもはやOSX 10.8に適用されませんapple.stackexchange.com/questions/57385/...
thatsmydoing

1
@tim_yatesはエディット読むためにあなたの答えの最初の行「にアップしてもらえを含む ライオンそれが正しい何であることを考えると、(10 * 7 *)を」?その編集を元のあいまいな「マウンテンライオンまで」に加えようとしたところ、レビュアーがそれを失敗しました。
mklement0 2013年

67

単一のソースからのコマンドラインとGUIアプリケーションの両方に対するソリューション(Mac OS X v10.10(Yosemite)およびMac OS X v10.11(El Capitan)で動作)

~/.bash_profile次のスニペットのように、環境変数の定義があると仮定します。

export JAVA_HOME="$(/usr/libexec/java_home -v 1.8)"
export GOPATH="$HOME/go"
export PATH="$PATH:/usr/local/opt/go/libexec/bin:$GOPATH/bin"
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"

Launch Agentが必要です各ログインで実行され、いつでもオンデマンドでこれらの変数をユーザーセッションにロードがです。これらの定義を解析し、エージェントによって実行される必要なコマンドを構築するためのシェルスクリプトも必要です。

次の内容で、plistサフィックス(例:という名前osx-env-sync.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>osx-env-sync</string>
  <key>ProgramArguments</key>
  <array>
    <string>bash</string>
    <string>-l</string>
    <string>-c</string>
    <string>
      $HOME/.osx-env-sync.sh
    </string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

-lパラメータはここで重要です。ログインシェルでシェルスクリプトを実行するために必要ですので、~/.bash_profileこのスクリプトが実行される前にそもそもソースが読み込まれます。

さて、シェルスクリプト。~/.osx-env-sync.sh次の内容で作成します。

grep export $HOME/.bash_profile | while IFS=' =' read ignoreexport envvar ignorevalue; do
  launchctl setenv ${envvar} ${!envvar}
done

シェルスクリプトが実行可能であることを確認します。

chmod +x ~/.osx-env-sync.sh

次に、現在のセッションの起動エージェントをロードします。

launchctl load ~/Library/LaunchAgents/osx-env-sync.plist

(再)GUIアプリケーションを起動し、環境変数を読み取れることを確認します。

設定は永続的です。再起動や再ログイン後も存続します。

初期設定(先ほど行った設定)の後、変更を~/.bash_profile環境全体に再度反映したい場合は、launchctl load ...コマンドを再実行しても期待どおりに動作しません。代わりに、次のような警告が表示されます。

<$HOME>/Library/LaunchAgents/osx-env-sync.plist: Operation already in progress

ログアウト/ログインプロセスを実行せずに環境変数をリロードするには、次のようにします。

launchctl unload ~/Library/LaunchAgents/osx-env-sync.plist
launchctl load ~/Library/LaunchAgents/osx-env-sync.plist

最後に、すでに実行中のアプリケーション(Terminal.appを含む)を再起動して、変更を認識させます。

また、ここでコードと説明をGitHubプロジェクトにプッシュしました:osx-env-sync

これが、少なくとも最新バージョンのOS X(Yosemite&El Capitan)にとって、究極のソリューションになることを願っています。


うまく動作します。これがセキュリティの抜け穴になると人気が出たのではないかと少し心配
Warren P

3
この解決策は、私が適切に機能できる唯一のものでした。素晴らしいソリューション。Macでこれがなぜ難しいのか理解できません...
JohnyTex

2
El Capitanでは、残念ながらこれは機能しません。github.com/ersiner/osx-env-sync/issues/1#issuecomment-169803508からのコメントは、問題をよく説明しています。
mgol

1
したがって、このソリューションは機能せず、/ etc / launchd.confは効果がなく、Node.jsはそのバイナリを/ usr / local / binにインストールし、このパスはGUIアプリのPATHにありません。したがって、Nodeを使用したGitフックは、El CapitanのSourceTreeなどのGUI Gitアプリではまったく機能しません。これはひどい。
mgol

1
問題はPATH変数のみです。すぐに解決策が見つかるといいのですが
Ersin Er 2016

54
  1. 行う:

    vim ~/.bash_profile

    ファイルが存在しない可能性があります(存在しない場合は、作成するだけです)。

  2. これを入力してファイルを保存します。

    export PATH=$PATH:YOUR_PATH_HERE
  3. 走る

    source ~/.bash_profile

exportBASHはサポートしていないため、+ 1 は私が提案しようとしていたものですsetenv
vol7ron

今のところ機能します。この全体は思ったよりずっと複雑に見えます。後でこれらすべてのためにもう少し時間を費やす必要があります。ありがとう。
Collins、

34

OS Xで環境変数を扱う場合、本質的に2つの解決すべき問題があります。1つ目はSpotlight(Macメニュー/ステータスバーの右側にある虫眼鏡アイコン)からプログラムを呼び出すとき、もう1つはDockからプログラムを呼び出すときです。 。それは(標準シェルの場所から環境を読み込むため、ターミナルアプリケーション/ユーティリティからプログラムを起動することは簡単です~/.profile~/.bash_profile~/.bashrc、等)

Dockからプログラムを呼び出すとき~/.MacOSX/environment.plist は、<dict>要素に次のシーケンスが含まれている 場所を使用します<key>KEY</key><string>theValue</string>要素ます。

Spotlightからプログラムを呼び出す場合は、launchdが必要なすべてのキー/値設定でセットアップされていることを確認してください。

両方の問題を同時に解決するために、ユーザーアカウントのログイン項目(システム設定ツールで設定)を使用します。ログイン項目は、Emacs lisp関数を呼び出すbashスクリプトですが、お気に入りのスクリプトツールを使用して同じことを行うこともできます。このアプローチには、いつでも機能し、再起動を必要としないという追加の利点があります。つまり~/.profile、一部のシェルで編集、ログイン項目を実行し、DockまたはSpotlightから新しく呼び出されたプログラムに対して変更を表示できます。

詳細:

ログインアイテム: ~/bin/macosx-startup

#!/bin/bash
bash -l -c "/Applications/Emacs.app/Contents/MacOS/Emacs --batch -l ~/lib/emacs/elisp/macosx/environment-support.el -f generate-environment"

Emacs lisp関数: ~/lib/emacs/elisp/macosx/envionment-support.el

;;; Provide support for the environment on Mac OS X

(defun generate-environment ()
  "Dump the current environment into the ~/.MacOSX/environment.plist file."
  ;; The system environment is found in the global variable:
  ;; 'initial-environment' as a list of "KEY=VALUE" pairs.
  (let ((list initial-environment)
        pair start command key value)
    ;; clear out the current environment settings
    (find-file "~/.MacOSX/environment.plist")
    (goto-char (point-min))
    (setq start (search-forward "<dict>\n"))
    (search-forward "</dict>")
    (beginning-of-line)
    (delete-region start (point))
    (while list
      (setq pair (split-string (car list) "=")
            list (cdr list))
      (setq key (nth 0 pair)
            value (nth 1 pair))
      (insert "  <key>" key "</key>\n")
      (insert "  <string>" value "</string>\n")

      ;; Enable this variable in launchd
      (setq command (format "launchctl setenv %s \"%s\"" key value))
      (shell-command command))
    ;; Save the buffer.
    (save-buffer)))

注:このソリューションは、私が追加する前に来るもの、特にマットカーティスによって提供されるものの融合ですが、~/.bash_profileコンテンツプラットフォームを独立させ、launchd環境(Macのみの機能)の設定を別のスクリプトに入れることを意図的に試みました。


20
ワオ。私は、OS X上の一貫性のある環境を得るために必要な私はちょうど複雑に愕然としています...これは動作しませんと言って、しかしないよ
offby1

2
これは、私が10.9で見たすべてのソリューションの中で最高に機能します。唯一の欠点は、ログイン項目が不確定な順序で実行されるため、ログイン時にEmacs(たとえば)が起動された場合(たとえば、ログアウト時に開いていたため)、再起動しない限り、必ずしも環境変数を持たないことです。スクリプトの前に起動されるためです。
テロトリウム2014年

22

別の無料のオープンソースMac OS X v10.8(Mountain Lion)設定ペイン/environment.plistソリューションはEnvPaneです。

GitHubで入手可能なEnvPaneのソースコード。それはに匹敵する機能を持っているようEnvPaneのルックスはRCEnvironmentを、しかし、すなわち、それは即座にその保存された変数を更新することができそうですなし歓迎され、再起動やログインの必要性。

開発者が述べたように:

EnvPaneはMac OS X 10.8(Mountain Lion)の環境設定ペインで、グラフィカルセッションとターミナルセッションの両方ですべてのプログラムの環境変数を設定できます。Mountain Lionの〜/ .MacOSX / environment.plistのサポートを復元するだけでなく、ログアウトして再度ログインする必要なしに、変更内容をすぐに環境に公開します。<SNIP> EnvPaneには、 1)ログイン後の早い段階と2)〜/ .MacOSX / environment.plistが変更されるたびに実行されるlaunchdエージェント。エージェントは〜/ .MacOSX / environment.plistを読み取り、そのファイルから、launchctl setenvおよびlaunchctl unsetenvで使用されるのと同じAPIを介して現在のユーザーのlaunchdインスタンスに環境変数をエクスポートします。

免責事項:私は開発者や彼/彼女のプロジェクトとは全く関係がありません。

PS私は名前が好きです(「Ends Pain」のような音)。


2
現在、EnvPaneはPATHを設定できません。github.com/hschmidt/EnvPane/issues/5:詳細については、私のバグレポート参照してください
ウヴェ・ギュンター

私は♥️このこと..唯一の欠点.. すべてのソリューションが ..の犠牲になると思う..-プロセスを再起動する必要がある-新しい "環境"を継承すること。Wonk wonk。
アレックスグレイ

2
@sorin:発生している問題の説明をGitHubサイトで公開できますか?EnvPaneは10.10で動作します。免責事項:私はEnvPaneの作成者です。
Hannes、2015年

17

アップデート(2017-08-04)

(少なくとも)macOS 10.12.6(Sierra)の時点で、このメソッドはApacheのhttpd(systemとのuserオプションの両方launchctl config)で機能しなくなったようです。他のプログラムは影響を受けていないようです。これはhttpdのバグであると考えられます。

元の答え

これはOS X 10.10+に関係します(特に10.11+ /usr/binは、が書き込み不能になったルートレスモードが原因です)。

OS Xのバグが原因で変数launchctl setenv PATH <new path>を設定するためにを使用しPATHても機能しないことを複数の場所で読んだことがあります(これは個人的な経験からそうです)。シェルから起動されないアプリケーションPATHにを設定できる別の方法があることがわかりました。

sudo launchctl config user path <new path>

このオプションは、launchctlのmanページに記載されています。

設定システム| ユーザーパラメータ値

launchd(8)ドメインの永続的な設定情報を設定します。システムドメインとユーザードメインのみを構成できます。永続ストレージの場所は実装の詳細であり、そのストレージへの変更はこのサブコマンドを通じてのみ行う必要があります。このサブコマンドで行った変更を有効にするには、再起動が必要です。

[...]

ターゲットドメイン内のすべてのサービスのPATH環境変数を文字列値に設定します。文字列値は、environ(7)のPATH環境変数で説明されている形式に準拠している必要があります。サービスが独自のPATHを指定している場合、サービス固有の環境変数が優先されることに注意してください。

注:この機能を使用して、ドメイン内のすべてのサービスの一般的な環境変数を設定することはできません。セキュリティ上の理由から、意図的にPATH環境変数のみにスコープが設定されています。

これは、Finderから起動したGUIアプリケーション(getenvPATHの取得に使用)で動作することを確認しました。これを行う必要があるのは1回だけであり、変更は再起動後も持続することに注意してください。


それも私にとってはうまくいきます。sudo launchctl procinfo <gui-pid>新しく設定されたPATH環境を示します。しかし、sudo launchctl config user path <new path>実際にはすべてのユーザーに設定されています...(新しいユーザーを追加し、Sublime Textのpythonコンソールを使用して確認されます)
Bossliaw

1
これは、ログイン時に再度開かれる(シャットダウン時に開いていた)アプリケーションのPATH環境変数には影響を与えないようです。
Brecht Machiels 16

面白い。つまり、再度開かれるアプリケーションでは、環境(またはそのサブセット)が保存されます。
Max Leske

@MaxLeskeいいえ、環境変数が変更される前に、再度開かれたアプリケーションが開始されています。したがって、sudo launchctl config user pathこれが発生するのは、を実行した後だけではありません(想定しているように思われますか?)。
Brecht Machiels 16

1
@ShlomiSchwartz launchctlでは、任意の環境変数を設定できませPATH変数は例外です。
Max Leske 2017

17

Mountain Lionでは、すべての編集/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:もちろん、特定のパスのニーズに合わせてパスエントリを調整する必要があります。


3
このソリューションは、システムへの侵入を最小限に抑えるという標準を満たしています。ありがとう。
John Vance

@John Vance +1完全に同意します。JasonT. Millerが彼の回答で明確に説明しているように、システム全体の変更は常に危険です
rmcsharry

5
エルキャピタンでは私には何の影響もありません。:(
mgol

私は、アプリケーションの変更すると、ハイシエラ10.13で、Info.plistファイルを、アプリケーションのロードに失敗しますLSOpenURLsWithRole() failed with error -10810 for the file /Applications/Slack.app.
kunjbhai

16

ここでの答えは「間違っている」わけではありませんが、もう1つ追加します。OSXで環境変数を変更しないでください。「すべてのプロセス」、またはシェルの外側にさえ影響を与え、すべてのプロセスが特定のユーザーによってインタラクティブに実行されます。

私の経験では、すべてのプロセスのPATHなどの環境変数へのグローバルな変更は、WindowsよりもOS Xで問題を引き起こす可能性がさらに高くなります。理由は、多くのOS Xアプリケーションおよびその他のソフトウェア(おそらく、特にOS自体のコンポーネントを含む)は、内部ではUNIXコマンドラインツールに依存しており、システムで提供されるこれらのツールのバージョンの動作を想定しているためです。絶対パスを使用する必要はありません(同様のコメントが動的に読み込まれるライブラリとDYLD_ *環境変数に適用されます)。たとえば、PythonやRubyなどのインタプリタのOS X提供バージョンの置き換えに関するさまざまなスタックオーバーフローの質問に対する最高評価の回答は、一般に「これを行わない」と言っていることを考慮してください。

OS Xは、この点で他のUNIXライクなオペレーティングシステム(Linux、FreeBSD、Solarisなど)とまったく同じです。Appleがこれを行う簡単な方法を提供していない最も可能性の高い理由は、それが物事を壊すためです。Windowsがこれらの問題の影響を受けにくい範囲では、次の2つの理由が原因です。(1)Windowsソフトウェアは、UNIXソフトウェアのようにコマンドラインツールに依存しない傾向があり、(2)Microsoftは、 PATHなどの「グローバル」構成オプションの影響を制限するために、新しいWindowsバージョンでの動的ロードの動作を変更したすべてのプロセスに影響を与える変更によって引き起こされる「DLL hell」とセキュリティ問題の両方のそのような広範な履歴。

「ラメ」かどうかにかかわらず、そのような変更を小さなスコープに制限すると、はるかに安定したシステムになります。


1
方法を尋ねたことをしないように人々に告げることは、彼らが尋ねた質問に対する答えではありません。人々がこれをするのを防ぐことは、物事を壊すことでもあります。Appleの手口。
Frabjous

/Applications/App.app/Contents/Info.plistのPATHにLSEnvironmentキーdeveloper.apple.com/library/archive/documentation/General/…を設定することは、現在推奨される解決策かもしれません。
デイブX

15

以前の答えがすべてうまくいかない場合があります。システム変数にアクセスしたい場合(M2_HOMEEclipseまたはIntelliJ IDEAで)に場合、この場合に機能するのは次のとおりです。

最初(ステップ1)編集 /etc/launchd.confような行を含むようにします: "setenv VAR value"次に(ステップ2)再起動します。

OS Xではアプリケーションが他のUnixのように起動されないため、単に.bash_profileを変更するだけでは機能しません。親のシェル変数を継承しません。他のすべての変更は、私には不明な理由で機能しません。多分誰かがこれについて明確にすることができます。


5
Spotlightまたはその他の方法で開始されたアプリケーションはすべて、親プロセスによって/etc/launchd.confが読み取られるため、すべてのアプリとシェルで可視の環境変数を設定する場所を魅力的に選択できます。
マシューマッカロー

1
-再起動を回避し、別のソリューションのための私の答え、参照stackoverflow.com/questions/135688/...
マット・カーティス

MaxOS 10.6マシンには/etc/launchd.confファイルがありません。これは、このバージョンの時点で新しいものか、古いものですか?それともこのマシンはめちゃくちゃですか?
peterk

13

[ 環境変数]設定ペインを追跡し、リンクが壊れていて、Appleのサイトを検索したところ、リンクを忘れたことを示しているようです...とらえどころのないlaunchdプロセスの軌跡に戻りました。

私のシステム(Mac OS X 10.6.8)では、environment.plistで定義された変数 Spotlightから(launchdを介して)起動されたアプリに確実にエクスポートされているようです。私の問題は、これらの変数がターミナルの新しいbashセッションにエクスポートされないことです。すなわち、私はここに描かれているように反対の問題を抱えています。

注:以前に説明したように、environment.plistはXMLではなくJSONのように見えます

〜/ MacOSX / environment.plist 編集することでSpotlightアプリに変数を表示 させることができました。また、.profileファイルに以下を追加することにより、同じ変数を強制的に新しいターミナルセッションに入れることができました。

eval $(launchctl export)

2
わかりにくいわけではありません:RC環境
ギリマンジャロ'10

launchctlエクスポートに関する素晴らしいヒント。しかし、私はそれをそのまま.profileに入れません。$ PATHを/ usr / local / binを含まないもので上書きします。ただし、正規表現を使用して、関心のある変数を選択できます: `` eval $(launchctl export | grep '^ my。* =')。
mivk

3
私の新しいMountain Lionマシン(10.8.2)では、environment.plistはまったく役に立ちません。正しい道についてはマシューの答えを見てください。それはすべて、/ etc / launchd.confとともに起動されたlaunchctlコマンドラインアプリに関するものです。あなたが自分自身を読むことができるman launchdman launchctlman launchd.confターミナルウィンドウに表示されます。Mac Developer Libraryが少し遅れていても、うれしいAppleはマニュアルページを最新に保ちます。
ラッセルB

10

Bashの起動ファイルのいずれか- 、~/.bashrc、。~/.bash_profile GUIアプリケーションの環境変数に~/.profileちなんで名付けられたある種の奇妙なファイルもあり~/.MacOSX/environment.plistます。


10

Matt Curtisの回答と同様に、launchctlを介して環境変数を設定しますが、exportという関数でラップします。これにより、.bash_profileで通常のように変数をエクスポートするときは常に、launchctlによっても設定されます。これが私がすることです:

  1. 私の.bash_profileは1行のみで構成されています(これは個人的な設定です)。

    source .bashrc
  2. 私の.bashrcにはこれがあります:

    function export()
    {
        builtin export "$@"
        if [[ ${#@} -eq 1 && "${@//[^=]/}" ]]
        then
            launchctl setenv "${@%%=*}" "${@#*=}"
        elif [[ ! "${@//[^ ]/}" ]]
        then
            launchctl setenv "${@}" "${!@}"
        fi
    }
    
    export -f export
  3. 上記はBash組み込みの「export」をオーバーロードし、すべてを通常どおりにエクスポートし(「export」を一緒にエクスポートすることに気付くでしょう!)、次に、launchctlを介してOS Xアプリ環境に適切に設定します。

    export LC_CTYPE=en_US.UTF-8
    # ~$ launchctl getenv LC_CTYPE
    # en_US.UTF-8
    PATH="/usr/local/bin:${PATH}"
    PATH="/usr/local/opt/coreutils/libexec/gnubin:${PATH}"
    export PATH
    # ~$ launchctl getenv PATH
    # /usr/local/opt/coreutils/libexec/gnubin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
    export CXX_FLAGS="-mmacosx-version-min=10.9"
    # ~$ launchctl getenv CXX_FLAGS
    # -mmacosx-version-min=10.9
  4. このようにして、毎回すべての変数をlaunchctlに送信する必要がなく、.bash_profile / .bashrcを希望どおりに設定することができます。ターミナルウィンドウを開き、で興味のある環境変数をチェックアウトlaunchctl getenv myVarし、.bash_profile / .bashrcで何かを変更し、ターミナルウィンドウを閉じて再度開き、launchctlで変数を再度確認して、変更します。

  5. 繰り返しになりますが、Mountain Lion後の世界の他のソリューションと同様に、新しい環境変数をアプリで使用できるようにするには、変更後にそれらを起動または再起動する必要があります。


1
役に立つ答え-ありがとう。元のソリューションでは、設定している環境変数の値に等号が含まれている場合を処理しなかったため、更新しました(例:CXX_FLAGS = "-mmacosx-version-min = 10.9"
Steve Broberg

@SteveBroberg-1文字変更するだけで、sedを必要とせずにBashの正規表現が修正されます。(私を誤解しないでください、私はsedが大好きですが、これは機能し、はるかに短くなります。)
courtlandj

1
私はもっ​​と良い方法があるはずだと考えましたが、私はbashの第一人者ではなく、%%や##が何であるかなどをグーグルできませんでした
Steve Broberg

10

ここにあなたが望むことをする非常に簡単な方法があります。私の場合、それはGradleを機能させることでした(Android Studioの場合)。

  • ターミナルを開きます。
  • 次のコマンドを実行します。

    sudo nano /etc/paths または sudo vim /etc/paths

  • プロンプトが表示されたら、パスワードを入力します。

  • ファイルの下部に移動し、追加するパスを入力します。
  • ヒットControl+ X終了します。
  • 「Y」を入力して、変更したバッファーを保存します。
  • 新しいターミナルウィンドウを開き、次のように入力します。

    echo $PATH

PATHの最後に追加された新しいパスが表示されます。

私はこの投稿からこれらの詳細を得ました:

Mac OS X 10.8 Mountain Lion以降のPATHに追加します



7

各ファイルの目的を簡潔かつ明確にする

  • ~/.profile Terminal.appが起動されるたびに供給されます
  • ~/.bashrc 「伝統的に」Bash環境のすべてのエクスポートステートメントが設定されている場所です
  • /etc/paths Mac OSのメインファイルで、すべてのユーザーのPATH環境変数を構築するためのデフォルトパスのリストが含まれています
  • /etc/paths.d/ 追加の検索パスを保持するファイルが含まれています

非端末プログラムは、端末が行うシステム全体のPATHおよびMANPATH変数を継承しません!特定のユーザーによって起動されたすべてのプロセスの環境を設定し、Mac OS X GUIアプリケーションで環境変数を使用できるようにするには、それらの変数を~/.MacOSX/environment.plist(Apple Technical Q&A QA1067)

あなたを同期するために、次のコマンドラインを使用environment.plistして/etc/paths

defaults write $HOME/.MacOSX/environment PATH "$(tr '\n' ':' </etc/paths)"

6

/etc/launchd.confは、OS X v10.10(Yosemite)、OS X v10.11(El Capitan)、macOS v10.12(Sierra)、またはmacOS v10.13(High Sierra)では使用されません。


launchctlmanページから:

/etc/launchd.conf file is no longer consulted for subcommands to run during early boot time;
this functionality was removed for security considerations.

この「別の質問に答える」で説明されている方法は私にとって有効です(再起動後)。DockまたはSpotlightから起動されたアプリケーションは、で設定した環境変数を継承します~/Library/LaunchAgents/my.startup.plist。(私の場合、Sublime TextプラグインLANGen_US.UTF-8、に設定する必要がありました。)


再起動時に、最後のセッションのアプリケーションが再起動される前にmy.startup.plistが読み込まれるようにする読み込み順序はありますか?
クンバハイ


3

それは簡単です:

〜/ .profileを編集し、変数を次のように配置します

$ vim〜/ .profile

ファイルに入れて:

MY_ENV_VAR =値

  1. 保存(:wq)

  2. ターミナルを再起動します(終了して再度開きます)

  3. すべてが問題ないことを確認してください:

$エコー$ MY_ENV_VAR

$値



3

単一ユーザーの変更に~/.profileは、リストしたものを使用します。次のリンクは、さまざまなファイルがBashによって読み取られるタイミングについて説明しています。

http://telin.ugent.be/~slippens/drupal/bashrc_and_others

GUIアプリケーションの環境変数を設定する場合は、〜/ .MacOSX / environment.plistファイルが必要です


3

まあ、/etc/paths~/.MacOSX/environment.plistファイルについてはわかりません。それらは新しいです。

しかし、Bashでは、.bashrc新しいシェルが呼び出されるたびに.bash_profile実行され、起動時に一度だけ実行されることを知っておく必要があります。

Mac OS Xでこれがどのくらいの頻度で発生するかはわかりません。この違いは、ウィンドウシステムがすべてを起動することで壊れたと思います。

個人的に、私.bashrcは必要なものすべてを含むファイルを作成することで混乱を取り除き、次に行います:

ln -s .bashrc .bash_profile

3

提案されたアプローチに加えて注意すべきことの1つは、少なくともOS X 10.5(Leopard)では、で設定された変数launchd.confがで行われた設定とマージされるということ.profileです。これはの設定で~/.MacOSX/environment.plistも有効である可能性が高いと思いますが、確認していません。


3

Mac OSでPATH環境変数を設定する

ターミナルプログラムを開きます(これはデフォルトでアプリケーション/ユーティリティフォルダにあります)。次のコマンドを実行します

touch ~/.bash_profile; open ~/.bash_profile

これにより、デフォルトのテキストエディタでファイルが開きます。

例としてAndroid SDKの場合:

Android SDKプラットフォームツールとツールディレクトリへのパスを追加する必要があります。私の例では、SDKがインストールされているディレクトリとして「/ Development / android-sdk-macosx」を使用します。次の行を追加します。

export PATH=${PATH}:/Development/android-sdk-macosx/platform-tools:/Development/android-sdk-macosx/tools

ファイルを保存して、テキストエディタを終了します。.bash_profileを実行して、PATHを更新します。

source ~/.bash_profile

これで、ターミナルプログラムを開くたびに、PATHにAndroid SDKが含まれます。


3

これを本当に簡単かつ迅速に行いました。まず、ターミナルから〜/ .bash_profileを作成します:

touch .bash_profile

その後

open -a TextEdit.app .bash_profile

追加

export TOMCAT_HOME=/Library/Tomcat/Home

文書を保存すれば完了です。


パーフェクト。JAVA_HOMEの手順を実行しましたが、エクスポートJAVA_HOME = / Library / Java / JavaVirtualMachines / jdk1.8.0_201.jdk / Contents / Homeを追加しただけで、すぐに成功しました。
NarendraC

素晴らしい@NarendraC!
CodeOverRide

2

とても簡単です。ファイル.profile(vi、nanoSublime Textまたはその他のテキストエディター)ファイルを編集します。あなたはでそれを見つけることができ~/、このようなディレクトリ(ユーザディレクトリ)とセット:

export MY_VAR=[your value here]

Javaホームの例:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/current

保存してターミナルに戻ります。

あなたはそれをリロードすることができます:

source .profile

または、ターミナルウィンドウを閉じて開きます。


2

ここには2種類の砲弾があります。

  • 非ログイン:Bashの新しいコピーを開始するたびに.bashrcがリロードされます
  • ログイン:.profileは、ログインするか、Bashにロードしてログインシェルとして使用するように明示的に指示した場合にのみロードされます。

ここで理解することが重要です。Bashを使用する.bashrcと、ファイルは対話型で非ログインのシェルによってのみ読み取られます.bashrc.bash_profileこの制限を克服するためにれる。

これで基本的な理解ができたので、セットアップをアドバイスする方法に移りましょう。

  • .profile:存在しないものを作成します。PATHセットアップをそこに配置します。
  • .bashrc:存在しない場合に作成します。すべてのエイリアスとカスタムメソッドをそこに配置します。
  • .bash_profile:存在しない場合は作成します。そこに以下を入れてください。

.bash_file:

#!/bin/bash
source ~/.profile # Get the PATH settings
source ~/.bashrc  # Get Aliases and Functions
#

2

ログインシェル

/etc/profile

シェルは最初にfile内のコマンドを実行します/etc/profile。root権限で作業しているユーザーは、このファイルをセットアップして、Bashを実行しているユーザーのシステム全体のデフォルト特性を確立できます。

.bash_profile
.bash_login
.profile

シェルのルックス次に~/.bash_profile~/.bash_login~/.profileそれが見つけたこれらのファイルの最初のコマンドを実行し、そのためには、(〜/自分のホームディレクトリの短期手です)。これらのファイルのいずれかにコマンドを入れて、で設定されたデフォルトを上書きできます/etc/profile。仮想端末で実行されているシェルは、これらのファイルのコマンドを実行しません。

.bash_logout

ログアウトすると、bashは~/.bash_logoutファイル内のコマンドを実行します。このファイルには、一時ファイルを削除するコマンドなど、セッション後にクリーンアップするコマンドが含まれていることがよくあります。

対話型非ログインシェル

/etc/bashrc

bashから直接呼び出されることはありませんが、多くの~/.bashrcファイルがを呼び出します/etc/bashrc。このセットアップにより、root権限を使用するユーザーは、非ログインbashシェルのシステム全体のデフォルト特性を確立できます。

.bashrc

対話型の非ログインシェルは、~/.bashrcファイル内のコマンドを実行します。通常、などのログインシェルの起動ファイル.bash_profileがこのファイルを実行するため、ログインシェルと非ログインシェルの両方がでコマンドを実行します.bashrc

のコマンドは.bashrc何度も実行される可能性があり、サブシェルはエクスポートされた変数を継承するため、.bash_profileファイル内の既存の変数に追加するコマンドを配置することをお勧めします。


2

iOSのすべての魔法はsource、環境変数をエクスポートするファイルでのみ使用できます。

例えば:

次のようなファイルを作成できます。

export bim=fooo
export bom=bar

このファイルをとして保存しbimbom.envsource ./bimbom.ev。Voilá、環境変数を取得しました。

それらを確認してください:

echo $bim

1

Bashの場合、環境変数をファイル/etc/profileに追加して、すべてのユーザーが使用できるようにします。再起動する必要はありません。新しいターミナルセッションを開始するだけです。

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