使用节点设置系统变量
Setting system variable using Node
我一直在开发一个节点脚本来安装外部依赖项,想知道是否可以使用 Node 设置 PATH 变量。
例如,如果我想使用脚本安装 Go,我可以执行命令 brew install Go
并且这有效,但是当我执行 export GOPATH=$PATH
时,这永远不会设置。
我也试过使用 process.env
但这也不起作用。另外,我对 process
的假设是它必须 运行 在沙箱中。所以它不会在外面更新/设置任何东西。
所以问题是,我可以这样做吗?如果是,如何?
任何编程语言都做不到。至少在 Unix(BSD、MacOS、Illumos 等)和 Linux 上,我不确定 Windows。
作为一项安全功能,Unix 进程的设计使其无法接触其父进程的环境。只有父进程才能影响子进程的环境。
当您使用命令行时,您是 运行 一个 shell 程序(Bash 或 Korn Shell 或 TCSH 或 Fish 等)。当你在命令行上执行某些东西时,例如 node.js 脚本或 Google Chrome 或 Minecraft,这些程序将成为你的 shell 程序的子程序。在 Unix 和 Linux 上,这些子程序继承其父程序的环境。
这就是为什么您可以导出环境(全局)变量并且您的程序可以访问它们的原因。然而,这种关系是单向的,而且是故意这样设计的。
您可能会注意到,在 shell 脚本中,您可以“保存”命令以在文件中设置环境变量。例如在 Bash 你有时会看到人们这样做:
# variables.sh
export HELLO "World"
但是,如果您将脚本作为脚本执行,这将不起作用:
$ bash variables.sh
$ echo $HELLO
<--------------------- nothing is displayed here
the variable is not exported
您有时会看到人们这样做:
$ . variables.sh
$ echo $HELLO
World
您可能想知道它是如何工作的。好吧.. 在某些 shell 语言中,点命令导入脚本而不是将脚本作为单独的进程执行。可以把它想象成 javascript 中的 import
或 require()
。
当然,Bash不懂javascript语法。它也不理解 C++ 或 Java 或 Ruby 或 PHP。它只理解 Bash 语法。
所以更长的答案是,除了您正在使用的 shell 语言之外,任何编程语言都是不可能的(例如,如果您使用的是 Fish,则需要使用 Fish 语法编写脚本或如果您使用的是 Ksh,则需要使用 Korn 语法编写脚本。
我一直在开发一个节点脚本来安装外部依赖项,想知道是否可以使用 Node 设置 PATH 变量。
例如,如果我想使用脚本安装 Go,我可以执行命令 brew install Go
并且这有效,但是当我执行 export GOPATH=$PATH
时,这永远不会设置。
我也试过使用 process.env
但这也不起作用。另外,我对 process
的假设是它必须 运行 在沙箱中。所以它不会在外面更新/设置任何东西。
所以问题是,我可以这样做吗?如果是,如何?
任何编程语言都做不到。至少在 Unix(BSD、MacOS、Illumos 等)和 Linux 上,我不确定 Windows。
作为一项安全功能,Unix 进程的设计使其无法接触其父进程的环境。只有父进程才能影响子进程的环境。
当您使用命令行时,您是 运行 一个 shell 程序(Bash 或 Korn Shell 或 TCSH 或 Fish 等)。当你在命令行上执行某些东西时,例如 node.js 脚本或 Google Chrome 或 Minecraft,这些程序将成为你的 shell 程序的子程序。在 Unix 和 Linux 上,这些子程序继承其父程序的环境。
这就是为什么您可以导出环境(全局)变量并且您的程序可以访问它们的原因。然而,这种关系是单向的,而且是故意这样设计的。
您可能会注意到,在 shell 脚本中,您可以“保存”命令以在文件中设置环境变量。例如在 Bash 你有时会看到人们这样做:
# variables.sh
export HELLO "World"
但是,如果您将脚本作为脚本执行,这将不起作用:
$ bash variables.sh
$ echo $HELLO
<--------------------- nothing is displayed here
the variable is not exported
您有时会看到人们这样做:
$ . variables.sh
$ echo $HELLO
World
您可能想知道它是如何工作的。好吧.. 在某些 shell 语言中,点命令导入脚本而不是将脚本作为单独的进程执行。可以把它想象成 javascript 中的 import
或 require()
。
当然,Bash不懂javascript语法。它也不理解 C++ 或 Java 或 Ruby 或 PHP。它只理解 Bash 语法。
所以更长的答案是,除了您正在使用的 shell 语言之外,任何编程语言都是不可能的(例如,如果您使用的是 Fish,则需要使用 Fish 语法编写脚本或如果您使用的是 Ksh,则需要使用 Korn 语法编写脚本。