从Mac中的脚本启动新终端时设置PATH

时间:2015-05-18 17:26:15

标签: macos bash command-line terminal

我需要从脚本启动一个新的终端窗口并在这个新终端中设置一个环境变量,这样我就可以在那里运行一些命令。

这是我到目前为止所做的:

#!bin/bash
PATH=$PATH:$1
open -a Terminal /my/path/

注意$1是我在运行脚本时发送的值,如下所示:

./myScript /my/env/variable/path

终端已打开但未设置env变量。我在Linux中有一个类似的脚本工作正常,但由于某种原因,这行PATH=$PATH:$1在Mac中没有按预期工作。

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

PATH是一个特殊情况,因为几乎所有默认的dotfiles都会覆盖它。您需要审核您的用户~/.bashrc~/.profile等。

但是,如果我跑:

hello=world open -a Terminal .

...在该终端中,运行

echo "$hello"

...环境变量已成功传播。

现在,你怎么解决这个问题?一种方法是修改用户的dotfiles以尊重您通过的另一个变量:

foo_path=$1 open -a Terminal .

......以及~/.profile和/或~/.bashrc,视情况而定:

[ -n "$foo_path" ] && PATH=$PATH:$foo_path

当覆盖值可用时,您甚至可以替换PATH批发,并通过其他名称传递:

# in the user's dotfiles
[ -n "$PATH_override" ] && PATH=$PATH_override

# in your script
PATH_override=$PATH:$1 open -a Terminal .

请注意,将赋值放在与命令相同的行上是一个重要的细节 - 这样做可以将变量导出到该单个命令范围的环境中,而无需使用显式export调用。

答案 1 :(得分:3)

在Linux中,您的终端仿真程序默认打开一个非登录shell,因为在某些时候,您的登录会话是由一个进程启动的,该进程的环境最终是从登录shell继承的,登录shell通常已初始化PATH一些起始值。

但是,OS X不会从登录shell运行其窗口管理器,因此终端应用程序默认启动登录shell。在该过程中发生的第一件事是/etc/profile来源,它运行/usr/libexec/path_helper以生成一个shell命令来初始化PATH。但是,该命令将其设置为绝对路径,而不是将任何内容附加到先前的值。因此,新终端窗口中的shell会覆盖它可能从您的脚本继承的PATH的任何更改。

下面是一些可能的选项,但您选择哪一个很大程度上取决于您使用脚本的方式以及您希望如何处理它。

  • 配置终端以打开非登录shell而不是登录shell。 但是,这会阻止/etc/profile或您自己的.bash_profile执行;你可能想看一下配置文件的终端 除了脚本的默认值之外,尽管这样做可能需要比简单open命令更复杂的东西(可能涉及AppleScript)。
  • 在终端中打开的脚本中更改PATH,而不是 让它继承一个改变的PATH
  • 修改/etc/profile以取消对/usr/libexec/path_helper的调用,而是使用

    等手动初始化PATH
    PATH=$PATH:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:
    

    然而,这并不是真的值得推荐。