从 Mac 中的脚本启动新终端时设置 PATH
Set PATH when launching a new terminal from a script in Mac
我需要从脚本启动一个新终端 window 并在这个新终端中设置一个环境变量,这样我就可以 运行 那里的一些命令。
这是我目前拥有的:
#!bin/bash
PATH=$PATH:
open -a Terminal /my/path/
注意 </code> 是我在 运行 脚本时发送的值,如下所示:</p>
<pre><code>./myScript /my/env/variable/path
终端已打开,但未设置环境变量。我在 Linux 中有一个类似的脚本,它工作正常,但由于某些原因,这一行 PATH=$PATH:
在 Mac.
中没有按预期工作
有什么想法吗?
PATH
是一种特殊情况,因为它会被几乎所有默认的点文件集覆盖。您需要查看用户的 ~/.bashrc
、~/.profile
等
但是,如果我 运行:
hello=world open -a Terminal .
...在该终端中,运行
echo "$hello"
...环境变量传播成功
现在,你该如何解决这个问题?一种方法是修改用户的点文件以尊重您正在传递的另一个变量:
foo_path= open -a Terminal .
...并且,在 ~/.profile
and/or ~/.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: open -a Terminal .
请注意,将赋值与命令放在同一行是一个重要的细节——这样做会将变量导出到该单个命令范围内的环境中,而无需使用显式 export
打电话。
在 Linux 中,您的终端仿真器默认打开非登录 shell,因为在某些时候,您的登录会话是由一个进程启动的,该进程的环境最终是从登录 shell,通常已将 PATH
初始化为某个起始值。
OS 但是,X 不会 运行 它的 window 管理器来自登录 shell,所以终端应用程序开始登录 shell默认。在该过程中发生的第一件事是 /etc/profile
被获取,运行s /usr/libexec/path_helper
产生一个 shell 命令来初始化 PATH
。但是,该命令将其设置为绝对路径,而不是将任何内容附加到先前的值。因此,新终端 window 中的 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:
然而,这并不是真的推荐。
我需要从脚本启动一个新终端 window 并在这个新终端中设置一个环境变量,这样我就可以 运行 那里的一些命令。
这是我目前拥有的:
#!bin/bash
PATH=$PATH:
open -a Terminal /my/path/
注意 </code> 是我在 运行 脚本时发送的值,如下所示:</p>
<pre><code>./myScript /my/env/variable/path
终端已打开,但未设置环境变量。我在 Linux 中有一个类似的脚本,它工作正常,但由于某些原因,这一行 PATH=$PATH:
在 Mac.
有什么想法吗?
PATH
是一种特殊情况,因为它会被几乎所有默认的点文件集覆盖。您需要查看用户的 ~/.bashrc
、~/.profile
等
但是,如果我 运行:
hello=world open -a Terminal .
...在该终端中,运行
echo "$hello"
...环境变量传播成功
现在,你该如何解决这个问题?一种方法是修改用户的点文件以尊重您正在传递的另一个变量:
foo_path= open -a Terminal .
...并且,在 ~/.profile
and/or ~/.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: open -a Terminal .
请注意,将赋值与命令放在同一行是一个重要的细节——这样做会将变量导出到该单个命令范围内的环境中,而无需使用显式 export
打电话。
在 Linux 中,您的终端仿真器默认打开非登录 shell,因为在某些时候,您的登录会话是由一个进程启动的,该进程的环境最终是从登录 shell,通常已将 PATH
初始化为某个起始值。
OS 但是,X 不会 运行 它的 window 管理器来自登录 shell,所以终端应用程序开始登录 shell默认。在该过程中发生的第一件事是 /etc/profile
被获取,运行s /usr/libexec/path_helper
产生一个 shell 命令来初始化 PATH
。但是,该命令将其设置为绝对路径,而不是将任何内容附加到先前的值。因此,新终端 window 中的 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:
然而,这并不是真的推荐。