Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 从Mac中的脚本启动新终端时设置路径_Macos_Bash_Command Line_Terminal - Fatal编程技术网

Macos 从Mac中的脚本启动新终端时设置路径

Macos 从Mac中的脚本启动新终端时设置路径,macos,bash,command-line,terminal,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中无法正常工作 有什

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

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

#!bin/bash
PATH=$PATH:$1
open -a Terminal /my/path/
请注意,
$1
是我在运行脚本时发送的值,如下所示:

./myScript /my/env/variable/path
终端已打开,但未设置env变量。我在Linux中有一个类似的脚本,可以正常工作,但由于某种原因,这一行
PATH=$PATH:$1
在Mac中无法正常工作


有什么想法吗?

PATH是一个特例,因为它几乎会被任何默认的点文件集覆盖。您需要查看用户的
~/.bashrc
~/.profile

但是,如果我运行:

hello=world open -a Terminal .
…然后在终点站,跑

echo "$hello"
…环境变量已通过成功传播


现在,你如何解决这个问题?一种方法是修改用户的点文件,以尊重您正在传递的另一个变量:

foo_path=$1 open -a Terminal .
…并且,在
~/.profile
和/或
~/.bashrc
中,视情况而定:

[ -n "$foo_path" ] && PATH=$PATH:$foo_path
当覆盖值可用时,甚至可以通过不同的名称替换路径批发:

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

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

请注意,将赋值与命令放在同一行是一个重要的细节——这样做会将变量导出到单个命令作用域的环境中,而不需要使用显式的
导出
调用。

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

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

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

  • 将终端配置为打开非登录shell而不是登录shell。 但是,这将阻止
    /etc/profile
    或您自己的
    .bash\u profile
    执行;您可能需要查看带有配置文件的起始终端 除了脚本中的默认值之外,尽管这样做可能需要比简单的
    open
    命令(可能涉及AppleScript)更复杂的操作
  • 在终端中打开的脚本中更改
    PATH
    ,而不是 让它继承一个经过修改的
    路径
  • 编辑
    /etc/profile
    以删除对
    /usr/libexec/path\u helper
    的调用,而是手动初始化
    路径

    PATH=$PATH:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:
    
    然而,这并不是真正的建议


最有可能(几乎可以肯定)在终端的新shell中运行的rc脚本正在覆盖该值。使用PATH以外的环境变量进行测试——比如,
FOOBAR
(一定要导出它;您不需要在这里导出PATH,因为它已经在环境中,但FOOBAR不会)——您可能会在终端中看到它。您应该使用
export
来设置variable@Zulu,这不是路径的必填项,因为它已经出口了。对环境中已经存在的变量的更改将通过自动传播。顺便说一句--
#bin/bash
不是
#/bin/bash
。细节问题;不是以
开头的shebang将不会被尊重。
#!bin/bash
不是
#/bin/bash
也可以。我的答案在这里解释为什么Linux和Mac OS X之间的行为不同,但是Charles Duffy提供了一个比我建议的三个更干净的解决方案。我喜欢这个答案,因为它更了解OS X的复杂性;我投了赞成票。