在OS X上设置环境变量


849

在OS X中修改环境变量(如PATH)的正确方法是什么?

我稍微看了一下Google,发现了三个要编辑的文件:

  • / etc /路径
  • 〜/ .profile
  • 〜/ .tcshrc

我什至没有这些文件,而且我很确定.tcshrc是错误的,因为OS X现在使用bash。这些变量(尤其是PATH)在哪里定义?

我正在运行OS X v10.5(Leopard)。


env "switch.1.disabled=true" open -n /Applications/Eclipse.app/在新的系统环境下启动GUI应用程序。

Answers:


652

布鲁诺是正确的。我已经进行了广泛的研究,如果您想设置所有GUI应用程序中都可用的变量,则唯一的选择是/etc/launchd.conf

请注意,environment.plist不适用于通过Spotlight启动的应用程序。这是史蒂夫·塞克斯顿(Steve Sexton)在此处记录的

  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并且您应该看到新的变量。这些也将在IntelliJ IDEA和您通过Spotlight启动的其他GUI应用程序中提供。


3
我是说接受的答案(environment.plist)对我来说并不成功。我已经在四台机器上成功地在10.5和10.6上使用了launchd.conf方法。
马修·麦卡洛

54
有什么方法可以在重新启动系统的情况下进行操作?
sorin 2010年

40
上面提到的限制适用于MacOS X 10.5。但是,MacOS X 10.6不再具有此限制,即使在通过Spotlight启动的应用程序中,在environment.plist中设置值也可以正常工作。因此,对于雪豹而言,所选的答案是正确的;-)
路易·贾科梅

5
设置 launchd.conf是一种方法,但是需要重新启动(重新启动启动)。如果你想避免重新启动,请参阅我的回答stackoverflow.com/questions/135688/...
马特·柯蒂斯

23
提出的启动方法存在几个问题。大多数是特定于PATH环境变量的,但询问者确实提到了PATH。1)launchd.conf中的项目不会在ssh之类的交互式shell中应用到系统中。2)将“ setenv PATH / testdir”行追加到Terminal.app中的PATH,但吹走了OS X应用程序环境中的所有其他PATH项。3)在/etc/launchd.conf中执行“ setenv PATH $ {PATH}:/ testdir”不能正确扩展现有的$ PATH 4)launchd.conf适用于所有用户,而不只是一个用户。并不是说我有更好的选择。
NoahR 2011年

257

如何为Spotlight启动的新进程设置环境(无需重新启动)

您可以使用设置启动的环境(以及扩展名,从Spotlight开始的任何东西)launchctl setenv。例如设置路径:

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

或者,如果您要设置路径.bashrc或类似路径,则将其镜像到启动状态:

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

无需重新启动,尽管如果您希望应用拾取更改后的环境,则需要重新启动它。

这包括已经在Terminal.app下运行的所有shell,尽管如果您在那里,则可以直接设置环境,例如,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.confman launchctl


2
非常好一个!使用environment.plist的好处似乎是OS X尊重该文件的内容,而不必首先启动终端。无论如何,我认为您的答案主要集中在避免重新启动的必要性上,因此。
fotNelton

2
@kapuzineralex是的,它避免了重新启动,也更改了从Spotlight启动的程序的环境,但这样environment.plist做不会。
马特·柯蒂斯

2
以这种方式设置环境仅对我有用,直到我重新启动为止。重新启动Mac后,环境变量没有持续使用。马修的回答对我来说非常合适。
Shamal Karunarathne

8
@Shamal:我+1了您的评论,但请记住,Matthew的答案需要重新启动,而我指出的是无需重新启动即可更改它的正确方法。如果两者都需要,我建议您将路径设置放在launchd.conf中(这样它们将在重新启动后持续存在),然后使用带有类似“ source /etc/launchctl.conf; launchctl setenv PATH $ PATH”的脚本,因此您也可以在不想重新启动时“刷新”。
马特·柯蒂斯

5
@MattCurtis您能否直接编辑您的答案以明确表示,虽然不需要重新启动,但更改实际上在重新启动后会丢失?另外,在etc/launchd.conf重新启动之前应用更改的正确方法是使用@MatthewMcCullough的答案中的方法:egrep "^setenv\ " /etc/launchd.conf | xargs -t -L 1 launchctl
mklement0

106

最高包括OS X v10.7(Lion),您可以在以下位置进行设置:

~/.MacOSX/environment.plist

看到:

对于终端机中的PATH,您应该可以在.bash_profile或中设置.profile(尽管您可能必须创建它)

对于OS X v10.8(Mountain Lion)及更高版本, 您需要使用launchdlaunchctl


4
仅当您实际希望图形应用程序使用它们时。由于这些通常不使用环境变量,因此设置它们不是一个很好的地方。
克里斯·汉森

18
有一些非常好的使用环境变量的图形应用程序示例。例如,IntelliJ喜欢看到M2_HOME来了解Maven的住处。要让它查看变量,您需要在/etc/launchd.conf而不是environment.plist中进行设置。
马修·麦卡洛

3
供参考:preferences.plist在OS X 10.5上使用情况并不理想,因为当时preferences.plist还没有读取通过聚光灯启动的应用程序,请参阅Louis对Matthew的回答和email的评论。esm.psu.edu/ pipermail / macosx-emacs / 2010年5月/002113.html。对于OS X 10.6,environment.plist它应能正常工作。
Janus 2010年


1
@tim_yates 鉴于这是正确的,请您将答案的第一行编辑为“直到并包括 Lion(10. * 7 *)”。我试图对原始的,模棱两可的“ Up to Mountain Lion”进行编辑,但审稿人对此进行了修改。
mklement0

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"

我们需要启动代理,它将在每次登录时按需运行,并随时随地运行,以将这些变量加载到用户会话中。我们还需要一个shell脚本来解析这些定义并构建必要的命令以由代理执行。

在目录中创建带有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这里的参数很关键;必须使用登录shell执行shell脚本,以便~/.bash_profile在执行该脚本之前首先获取它。

现在,shell脚本。~/.osx-env-sync.sh使用以下内容创建它:

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

确保shell脚本是可执行的:

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 2016年

1
因此,该解决方案不起作用,/ etc / launchd.conf不起作用,Node.js将其二进制文件安装到/ usr / local / bin,并且该路径不在GUI应用程序的PATH中。因此,在El Capitan中,使用Node的Git钩子根本无法在诸如SourceTree之类的GUI Git应用中使用。这很糟糕。
mgol

1
问题仅与PATH变量有关。希望我们能尽快找到解决方案。
Ersin Er

54
  1. 做:

    vim ~/.bash_profile

    该文件可能不存在(如果不存在,则可以创建它)。

  2. 输入以下内容并保存文件:

    export PATH=$PATH:YOUR_PATH_HERE
  3. source ~/.bash_profile

+1 export是我要建议的,因为BASH不支持setenv
vol7ron 2012年

现在可以使用。这整个事情看起来比我想象的要复杂得多。以后将不得不花更多时间进行所有这些操作。谢谢。
拉托·柯林斯

34

在OS X中处理环境变量时,基本上要解决两个问题。第一个问题是从Spotlight调用程序(Mac菜单/状态栏右侧的放大镜图标),第二个问题是从Dock调用程序。 。从一个终端应用程序调用程序/实用程序是微不足道的,因为它从读出的标准外壳的位置的环境(~/.profile~/.bash_profile~/.bashrc等)

当调用从Dock程序,使用~/.MacOSX/environment.plist 其中所述<dict>元素包含的序列 <key>KEY</key><string>theValue</string>的元素。

从Spotlight调用程序时,请确保已使用所需的所有键/值设置来设置启动程序。

为了同时解决这两个问题,我在用户帐户上使用了登录项(通过“系统偏好设置”工具设置)。登录项目是一个bash脚本,它调用Emacs lisp函数,尽管当然可以使用他们喜欢的脚本工具来完成相同的事情。这种方法的额外好处是它可以随时工作,并且不需要重新启动,即~/.profile,可以在Dock中编辑,运行登录项目,并使更改对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)))

注意:此解决方案是在我添加我的解决方案之前合并而成的,尤其是Matt Curtis提供的解决方案,但是我故意尝试使自己的~/.bash_profile内容平台保持独立,并将launchd环境设置(仅Mac设施)放在单独的脚本中。


19
哇。我不是说这是不行的,但是......我只是感到震惊的复杂性需要得到在OS X上一致的环境
offby1

2
在我为10.9所见的所有解决方案中,这是最好的。唯一的缺陷是,由于登录项以不确定的顺序运行,因此,如果在登录时启动了Emacs(例如,)(例如,由于在注销时打开了),则除非重新启动它,否则它不一定具有环境变量。 ,因为它是在脚本之前启动的。
telotortium 2014年

22

EnvPane是另一个免费的开源Mac OS X v10.8(Mountain Lion)首选项窗格/environment.plist解决方案。

EnvPane的源代码可在GitHub上获得。EnvPane看起来具有与RCEnvironment类似的功能,但是,它似乎可以立即更新其存储的变量,即无需重新启动或登录,这是受欢迎的。

如开发商所说:

EnvPane是Mac OS X 10.8(Mountain Lion)的首选项窗格,可让您为图形会话和终端会话中的所有程序设置环境变量。它不仅可以恢复对Mountain Lion中〜/ .MacOSX / environment.plist的支持,而且还可以立即发布对环境的更改,而无需注销并重新登录。<SNIP> EnvPane包括(并自动安装)启动的代理程序,该代理程序将在1)登录后早期运行,以及2)每当〜/ .MacOSX / environment.plist更改时运行。代理读取〜/ .MacOSX / environment.plist,并通过与launchctl setenv和launchctl unsetenv相同的API将环境变量从该文件导出到当前用户的启动实例。

免责声明:我与开发人员或其项目无关。

PS我喜欢这个名字(听起来像“ Ends Pain”)。


2
EnvPane目前无法设置PATH。欲了解更多详情,请参阅我的错误报告:github.com/hschmidt/EnvPane/issues/5
乌韦半滑舌鳎

我♥️这件事..唯一的缺点..我认为任何解决方案都会成为 .. 的受害者。它是-必须重新启动进程-才能继承新的“环境”。鸣叫
亚历克斯·格雷

2
@sorin:您可以在GitHub网站上打开一个问题,以描述您遇到的问题吗?EnvPane在10.10上为我工作。免责声明:我是EnvPane的作者。
汉尼斯

17

更新(2017-08-04)

从(至少)macOS 10.12.6(Sierra)起,此方法似乎已停止为Apache httpd使用(对于systemuser选项,都适用launchctl config)。其他程序似乎没有受到影响。可以想象这是httpd中的错误。

原始答案

这涉及OS X 10.10+(10.11+,特别是由于无根模式,该模式/usr/bin不再可写)。

我已经在多个地方读到,由于OS X中的一个错误(根据个人经验,这似乎是事实),launchctl setenv PATH <new path>用于设置PATH变量的方法不起作用。我发现PATH可以为不是从shell启动的应用程序设置另一种方法:

sudo launchctl config user path <new path>

该选项记录在launchctl手册页中:

配置系统| 用户参数值

设置launchd(8)域的持久配置信息。只能配置系统域和用户域。持久性存储的位置是实现细节,并且只能通过此子命令对该存储进行更改。需要重新启动才能使通过此子命令所做的更改生效。

[...]

路径

将目标域内所有服务的PATH环境变量设置为字符串值。字符串值应符合environ(7)中PATH环境变量概述的格式。请注意,如果服务指定其自己的PATH,则特定于服务的环境变量将具有优先权。

注意:此功能不能用于为域内的所有服务设置常规环境变量。它是有意限制PATH环境变量的范围,出于安全考虑,别无其他。

我已经确认可以与从Finder(getenv用于获取PATH)启动的GUI应用程序一起使用。请注意,您只需执行一次,更改将通过重新启动保持不变。


它也对我有用。sudo launchctl procinfo <gui-pid>显示新设置的PATH环境。但sudo launchctl config user path <new path>实际上是为所有用户设置的...(通过添加新用户并使用Sublime Text的python控制台进行确认)
波斯利亚

1
这似乎对登录时重新打开(在关闭时打开)的应用程序的PATH环境变量没有影响。
Brecht Machiels '16

有趣。这意味着对于将要重新打开的应用程序,将保存环境(或其子集)。
Max Leske '16

@MaxLeske否,更改环境变量之前,正在启动重新打开的应用程序。因此,这不仅仅是sudo launchctl config user path发生后的第一次(您似乎在假设?)。
Brecht Machiels,2016年

1
@ShlomiSchwartz launchctl不会允许你任意设置环境变量。该PATH变量是一个例外。
Max Leske '17年

17

在Mountain Lion上,所有/etc/paths/etc/launchd.conf编辑均无效!

苹果的开发者论坛说:

“更改.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:当然,您必须调整Path条目以适合您的特定路径需求。


3
该解决方案符合系统上最少干扰的标准。谢谢。
John Vance 2013年

@John Vance +1完全同意,正如Jason T. Miller在回答中清楚解释的那样,系统范围的更改总是有风险的
rmcsharry 2014年

5
在El Capitan,这对我没有影响。:(
mgol

在High Sierra 10.13上,如果我修改应用程序的Info.plist文件,则该应用程序无法加载:LSOpenURLsWithRole() failed with error -10810 for the file /Applications/Slack.app.
kunjbhai

16

虽然这里的答案不是“错误的”,但我要补充一点:对于给定用户交互运行的所有进程,请不要在OS X中进行会影响“所有进程”甚至是外壳程序之外的环境变量更改。

以我的经验,对所有进程的环境变量(如PATH)的全局更改甚至比Windows上更容易使OS X崩溃。原因是,许多OS X应用程序和其他软件(尤其是OS本身的组件,尤其是OS本身的组件)都依赖于底层的UNIX命令行工具,并假定系统随附的这些工具的版本行为正常,并且这样做时不必使用绝对路径(类似的注释适用于动态加载的库和DYLD_ *环境变量)。例如,考虑一下关于替换有关由OS X提供的诸如Python和Ruby之类的解释器版本的各种Stack Overflow问题的最高评价的回答通常是“不要这样做”。

在这方面,OS X实际上与其他类似UNIX的操作系统(例如Linux,FreeBSD和Solaris)没有什么不同。苹果没有提供一种简单的方法来解决这个问题的最可能原因是因为它破坏了事情。在某种程度上,Windows不太容易出现这些问题,这是由于两件事:(1)Windows软件不像UNIX软件那样倾向于依赖命令行工具,以及(2)Microsoft已经拥有由于存在“ DLL地狱”和由影响所有进程的更改引起的安全问题的广泛历史,因此它们已更改了Windows新版本中的动态加载行为,从而限制了诸如PATH之类的“全局”配置选项的影响。

不管是否“ Lame”,如果将此类更改限制在较小的范围内,您将拥有一个更加稳定的系统。


告诉人们不要去做他们要求做的事情,并不是对他们提出的问题的答案。阻止人们这样做也破坏了事情。苹果的作案手法。
frabjous

使用LSEnvironment密钥developer.apple.com/library/archive/documentation/General/…在/Applications/App.app/Contents/Info.plist中设置PATH 可能是当前推荐的解决方案。
Dave X

15

有时,所有先前的答案都根本无效。如果您想访问M2_HOMEEclipse或IntelliJ IDEA中的系统变量(例如),则在这种情况下对我有用的唯一事情是:

首先(步骤1)进行编辑,/etc/launchd.conf以包含如下一行:“ setenv VAR value”,然后(步骤2)重新启动。

仅仅修改.bash_profile是行不通的,因为在OS X中应用程序无法像在其他Unix中那样启动。它们不继承父级的shell变量。所有其他修改由于我不知道的原因而无法使用。也许其他人可以对此进行澄清。


5
从Spotlight或其他任何方式启动的应用程序都可以通过其父进程读取/etc/launchd.conf,因此对于在所有应用程序和shell中设置环境变量的可见位置,这是一个吸引人的选择。
马修·麦卡洛

1
见我的回答另一种解决方案,避免了重新启动- stackoverflow.com/questions/135688/...
马特·柯蒂斯

我的MaxOS 10.6机器上没有/etc/launchd.conf文件。从这个版本开始,这是新的还是过时的?还是这台机器搞砸了?
彼得2011年

13

追逐“ 环境变量”首选项窗格并发现链接已断开,并且在Apple网站上进行的搜索似乎表明他们已将其忘记了……我回到了难以捉摸的启动过程中。

在我的系统(Mac OS X 10.6.8)上,似乎environment.plist 定义的变量已可靠地导出到从Spotlight启动的应用程序(通过启动)。我的麻烦是,这些var无法在Terminal中导出到新的bash会话中。即我遇到的问题与这里描述的相反。

注意:environment.plist看起来像JSON,而不是XML,如上所述

我可以通过编辑〜/ MacOSX / environment.plist 来使Spotlight应用程序看到var,并且 可以通过将以下内容添加到我的.profile文件中来将相同的var强制进入新的Terminal会话:

eval $(launchctl export)

2
并不是那么难以捉摸:RC环境
Gilimanjaro 2011年

关于launchctl导出的不错提示。但是我不会将它原样放在.profile中。它将用不包含/ usr / local / bin的$ PATH覆盖您的$ PATH。但是您可以使用正则表达式来选择您感兴趣的var:``eval $(launchctl export | grep'^ my。* =')。
mivk

3
在我的新Mountain Lion计算机(10.8.2)上,environment.plist完全不值钱。有关正确的信息,请参见马修的答案。这一切都与启动和launchctl命令行应用程序以及/etc/launchd.conf有关。你可以阅读了一下man launchdman launchctlman launchd.conf在终端窗口。即使Mac Developer Library有点滞后,高兴的Apple也会使手册页保持最新。
罗素B

10

任何Bash启动文件- ~/.bashrc~/.bash_profile~/.profile~/.MacOSX/environment.plist在GUI应用程序中,还为环境变量命名了某种奇怪的文件。


10

就像Matt Curtis给出的答案一样,我通过launchctl设置了环境变量,但是我将其包装在一个名为export的函数中,以便每当在我的.bash_profile中导出一个像普通的变量一样,也由launchctl设置。这是我的工作:

  1. 我的.bash_profile仅包含一行,(这只是个人喜好。)

    source .bashrc
  2. 我的.bashrc具有:

    function export()
    {
        builtin export "$@"
        if [[ ${#@} -eq 1 && "${@//[^=]/}" ]]
        then
            launchctl setenv "${@%%=*}" "${@#*=}"
        elif [[ ! "${@//[^ ]/}" ]]
        then
            launchctl setenv "${@}" "${!@}"
        fi
    }
    
    export -f export
  3. 上面的代码将使Bash内置的“导出”过载,并且将正常导出所有内容(您会注意到我使用它导出了“导出”!),然后无论是否使用以下任何一项,都可以通过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. 再次,与后山狮世界的其他解决方案一样,要使任何新的环境变量可用于应用程序,您都需要在更改后启动或重新启动它们。


1
有用的答案-谢谢。我刚刚对其进行了更新,因为您的原始解决方案无法处理您所设置的环境变量的值带有等号的情况(例如CXX_FLAGS =“-mmacosx-version-min = 10.9”
Steve Broberg

@SteveBroberg-只需更改一个字符即可修复Bash regexp,而无需sed!(别误会我,我喜欢sed,但这行得通,而且时间要短得多。)
courtlandj 2015年

1
我想必须有一个更好的办法,但我不是一个bash大师,我不能google一下%%,##人等
史蒂夫布罗贝里

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

在OS X v10.10(Yosemite),OS X v10.11(El Capitan),macOS v10.12(Sierra)或macOS v10.13(High Sierra)中未使用/etc/launchd.conf。


launchctl手册页:

/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。(在我的情况,我需要设置LANG,到en_US.UTF-8为一个崇高的文本插件。)


在重新启动时,是否有加载顺序可确保my.startup.plist在重新启动上一个会话的应用程序之前已被加载?
kunjbhai


3

这很简单:

编辑〜/ .profile并将变量如下

$ vim〜/ .profile

在文件中:

MY_ENV_VAR =值

  1. 保存(:wq)

  2. 重新启动终端(退出并再次打开)

  3. 确保一切正常:

$ echo $ MY_ENV_VAR

价值




3

好吧,我不确定/etc/paths~/.MacOSX/environment.plist文件。那些是新的。

但是使用Bash,您应该知道该.bashrc操作在每次新的Shell调用时都会执行,并且.bash_profile仅在启动时执行一次。

我不知道Mac OS X多久使用一次。我认为这种区别已经随着窗口系统启动所有内容而中断。

就个人而言,我通过创建一个.bashrc文件来消除混乱,然后执行以下操作:

ln -s .bashrc .bash_profile

3

除了建议的方法外,还要注意的一件事是,至少在OS X 10.5(Leopard)中,in中设置的变量launchd.conf将与in中进行的设置合并.profile。我想这可能也对其中的设置有效~/.MacOSX/environment.plist,但我尚未验证。


3

在Mac OS上设置PATH环境变量

打开终端程序(默认在“应用程序/实用工具”文件夹中)。运行以下命令

touch ~/.bash_profile; open ~/.bash_profile

这将在您的默认文本编辑器中打开文件。

以Android SDK为例:

您需要将路径添加到Android SDK平台工具和工具目录。在我的示例中,我将使用“ / Development / android-sdk-macosx”作为安装SDK的目录。添加以下行:

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

这里有两种弹壳。

  • 非登录:每次启动Bash的新副本时,都会重新加载.bashrc
  • 登录:.profile仅在您登录或显式告诉Bash加载并用作登录shell时才加载。

在这里重要的是要了解,使用Bash,文件.bashrc只能由交互且非登录的shell读取,您会发现人们经常.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

Shell首先执行file中的命令/etc/profile。具有root特权的用户可以设置此文件来为运行Bash的用户建立系统范围的默认特征。

.bash_profile
.bash_login
.profile

接下来的外壳看起来的~/.bash_profile~/.bash_login~/.profile(〜/是你的home目录短手),按照这个顺序,执行第一这些文件找到的命令。您可以将命令放在这些文件之一中,以覆盖中设置的默认值/etc/profile。在虚拟终端上运行的外壳程序不会在这些文件中执行命令。

.bash_logout

注销时,bash将执行~/.bash_logout文件中的命令。该文件通常包含在会话后清除的命令,例如那些删除临时文件的命令。

交互式非登录外壳

/etc/bashrc

尽管不是直接由bash ~/.bashrc调用,但是许多文件都调用/etc/bashrc。此设置允许使用root特权的用户为非登录bash shell建立系统范围的默认特征。

.bashrc

交互式非登录外壳程序执行~/.bashrc文件中的命令。通常,用于登录shell的启动文件(例如.bash_profile)运行该文件,因此登录shell和非登录shell都运行中的命令.bashrc

因为其中的命令.bashrc可能会执行多次,并且由于子外壳继承了导出的变量,所以最好将添加到现有变量中的命令放入.bash_profile文件中。


2

iOS上的所有魔力仅与source文件一起使用,您可以在其中导出环境变量。

例如:

您可以创建如下文件:

export bim=fooo
export bom=bar

将此文件另存为bimbom.env,然后执行source ./bimbom.ev。瞧,您有了环境变量。

检查它们:

echo $bim

1

对于Bash,请尝试将环境变量添加到文件中,/etc/profile以使所有用户都可以使用它们。无需重新启动,只需启动一个新的终端会话。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.