我需要从脚本启动一个新的终端窗口并在这个新终端中设置一个环境变量,这样我就可以在那里运行一些命令。
这是我到目前为止所做的:
#!bin/bash
PATH=$PATH:$1
open -a Terminal /my/path/
注意$1
是我在运行脚本时发送的值,如下所示:
./myScript /my/env/variable/path
终端已打开但未设置env变量。我在Linux中有一个类似的脚本工作正常,但由于某种原因,这行PATH=$PATH:$1
在Mac中没有按预期工作。
有什么想法吗?
答案 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
一些起始值。
/etc/profile
来源,它运行/usr/libexec/path_helper
以生成一个shell命令来初始化PATH
。但是,该命令将其设置为绝对路径,而不是将任何内容附加到先前的值。因此,新终端窗口中的shell会覆盖它可能从您的脚本继承的PATH
的任何更改。
下面是一些可能的选项,但您选择哪一个很大程度上取决于您使用脚本的方式以及您希望如何处理它。
/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:
然而,这并不是真的值得推荐。