【问题标题】:Write to terminal environment from bash or node从 bash 或节点写入终端环境
【发布时间】:2018-12-06 18:08:50
【问题描述】:

目标

我想编写一个脚本,它会提示用户输入一些信息,IE 大小、形状、颜色,然后它将放在 该终端的环境上。也许最重要的是,我还想在 npm 脚本中运行这个脚本。

示例

package.json

"scripts":{
   "fillVars": "source theThing.bs",
   "echoVarsHoursLater": "echo $theSize" //etc
}

theThing.bs

read -p "Size: " theSize
read -p "Shape: " theShape
read -p "Color: " theColor

注意事项

然后我希望这些环境变量可用于之后从同一终端运行的任何脚本或代码。不只是从该脚本中。如果可能,也不要从操作系统中的任何地方(也就是其他终端或会话)。

我知道如果我直接在终端中获取 theThing.bs,我可以让它工作。但我不知道如何通过 npm 脚本部分。

这在很大程度上是一个方便的工具,但它对这个过程非常有帮助。

【问题讨论】:

  • 无法更改其他进程的环境。
  • 进程(包括shell)有环境,但终端没有。似乎具有每个终端设置的程序会传递一个未修改的单个环境变量,该变量告诉您​​在哪里可以找到您的信息(ssh-agent,X11)或根据 tty 名称在已知文件中查找信息(sudo , sem)
  • @that other guy “终端”显然是指终端中的顶级交互式外壳。此外,基于现代软件的“终端”模拟器肯定有一个环境,包括环境变量。只有像 Televideo 950 这样的古老硬件终端才没有任何意义。
  • 这就像说如果您使用图形文件管理器,硬盘驱动器就有一个环境。不要混淆 PTY 及其控制过程。

标签: linux bash build environment-variables npm-scripts


【解决方案1】:

如果没有父进程的合作,UNIX 环境模型会使您所做的事情变得不可能。出于安全原因,子进程不能直接操纵其父进程的环境,包括其环境变量。通常的解决方案是让子进程编写一系列 shell 语句来设置环境变量并让父 shell “eval”命令。例如,如果您编写了一个名为 my_env_init 的 shell 脚本,它确实

echo export MY_SIZE=42

你会告诉用户输入

eval $(my_env_init)

当您像 NPM 程序一样在中间有任意层时,您尝试做的基本上是不可能的。因为它也必须收集您的环境设置脚本编写的命令并将这些命令回显到顶级 shell。您以错误的方式解决此问题,但没有人能够提供正确的答案,因为您的问题没有充分解释您为什么要这样做。

【讨论】:

    猜你喜欢
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2018-12-11
    相关资源
    最近更新 更多