首页 文章

Mac OS X中的环境变量

提问于
浏览
176

更新:以下链接没有完整的答案 . 必须在两个地方设置路径或变量(一个用于GUI,一个用于shell)是蹩脚的 .

Not Duplicate ofSetting environment variables in OS X?


来自Windows背景,可以很容易地设置和修改环境变量(只需转到系统属性>高级>环境变量),在Mac OS 10.5上似乎没那么直接 . 大多数参考文献都说我应该更新/ etc / profile或〜/ .profile . 那些是系统变量和用户变量的等价物吗?例如,我应该在哪里设置 JAVA_HOME 变量?


编辑:

我希望能够从终端以及像Eclipse这样的应用程序访问该变量 . 此外,我希望我不必重新启动/注销以使此生效 .

8 回答

  • 3

    没有必要重复 . 您可以使用 launchctl setenv 设置launchd(和子进程,即从Spotlight开始的任何内容)使用的环境变量 .

    例如,如果要在 .bashrc 中设置它或在以下任何位置镜像启动时的当前路径:

    PATH=whatever:you:want
    launchctl setenv PATH $PATH
    

    在运行的应用程序中不会自动更新环境变量 . 您需要重新启动应用程序以获取更新的环境变量(尽管您可以在shell中设置变量,例如 PATH=whatever:you:want ;不需要重新启动终端) .

  • 8

    您可以在几个地方设置环境变量 .

    • ~/.profile :将此用于要在终端启动的所有程序中设置的变量(请注意,与Linux不同,在Terminal.app中打开的所有shell都是登录shell) .

    • ~/.bashrc :对于非登录shell的shell调用此方法 . 将此用于别名和需要在子shell中重新定义的其他内容,而不是用于继承的环境变量 .

    • /etc/profile :这是在〜/ .profile之前加载的,但在其他方面是等效的 . 当您希望变量应用于计算机上所有用户启动的终端程序时(假设它们使用bash),请使用它 .

    • ~/.MacOSX/environment.plist :登录时登录窗口会读取此内容 . 它适用于所有应用程序,包括GUI应用程序,但Spotlight在10.5(而不是10.6)中启动的应用程序除外 . 它要求您注销并再次登录才能使更改生效 . 自OS X 10.8起不再支持此文件 .

    • 您的用户的 launchd 实例:这适用于用户,GUI和CLI启动的所有程序 . 您可以使用 launchctl 中的 setenv 命令随时应用更改 . 理论上,您应该能够在 ~/.launchd.conf 中放置 setenv 命令,并且 launchd 会在用户登录时自动读取它们,但实际上从未实现过对此文件的支持 . 相反,您可以使用其他机制在登录时执行脚本,并让该脚本调用 launchctl 来设置 launchd 环境 .

    • /etc/launchd.conf :当系统启动时和用户登录时,它由launchd读取 . 它们影响系统上的每个进程,因为launchd是根进程 . 要将更改应用于正在运行的root launchd,您可以将命令传递到 sudo launchctl .

    要理解的基本要素是:

    • 环境变量在进程分叉时由进程的子进程继承 .

    • 根进程是一个launchd实例,每个用户会话还有一个单独的launchd实例 .

    • launchd允许您使用 launchctl 更改其当前环境变量;然后,更新的变量将从之后分叉的所有新进程继承 .

    使用launchd设置环境变量的示例:

    echo setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE | launchctl
    

    现在,启动使用变量的GUI应用程序,瞧!

    要解决 ~/.launchd.conf 不起作用的事实,可以将以下脚本放在 ~/Library/LaunchAgents/local.launchd.conf.plist 中:

    <?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>local.launchd.conf</string>
      <key>ProgramArguments</key>
      <array>
        <string>sh</string>
        <string>-c</string>
        <string>launchctl &lt; ~/.launchd.conf</string>    
      </array>
      <key>RunAtLoad</key>
      <true/>
    </dict>
    </plist>
    

    然后你可以把 setenv REPLACE_WITH_VAR REPLACE_WITH_VALUE 放在 ~/.launchd.conf 里面,它会在每次登录时执行 .

    请注意,在以这种方式将命令列表传递到launchctl时,您将无法使用包含空格的值设置环境变量 . 如果需要,可以按如下方式调用launchctl: launchctl setenv MYVARIABLE "QUOTE THE STRING" .

    另请注意,在登录时运行的其他程序可能会在启动之前执行,因此可能看不到它设置的环境变量 .

  • 12

    我认为OP正在寻找的是一个简单的,类似Windows的解决方案 .

    你走了:

    https://www.macupdate.com/app/mac/14617/rcenvironment

  • 137

    你可以在linux上阅读,这与Mac OS X非常接近 . 或者你可以阅读更接近的BSD Unix . 在大多数情况下,Linux和BSD之间的差异并不大 .

    /etc/profile 是系统环境变量 .

    ~/.profile 是特定于用户的环境变量 .

    “我应该在哪里设置我的JAVA_HOME变量?”

    • 你有多个用户吗?他们在乎吗?你会通过更改 /etc/profile 来弄乱其他用户吗?

    一般来说,即使我是唯一的用户,我也不想搞乱系统范围的设置 . 我更喜欢编辑我的本地设置 .

  • 0

    对于GUI应用程序,您必须创建和编辑 ~/.MacOSX/environment.plist . 更多细节here . 您需要注销才能生效 . 我不确定它们是否也影响从终端发起的应用程序,但我认为它们会 .

    对于从终端启动的应用程序,您还可以编辑〜/ .profile文件 .

  • 283

    只需在终端中通过 nano 打开 ~/.profile 文件并在其中键入:

    export PATH=whatever/you/want:$PATH
    

    保存此文件(cmd X和Y) . 之后请再次注销/登录或只是在终端中打开一个新选项卡并尝试使用您的新变量 .

    请不要忘记在/ you / want之后添加“:$ PATH”,否则你将删除PATH变量中的所有路径,这些路径在此之前就已存在 .

  • 5

    使用 osx-env-sync 从单个源同步命令行和GUI应用程序的OS X环境变量 .

    我还发布了相关问题的回答here .

  • 3

    如果要在El Capitan上永久更改环境变量,请在 /etc/paths 中进行设置 . 请注意,默认情况下此文件是只读的,因此您必须 chmod 才能获得写入权限 .

相关问题