导出一个环境变量以在所有子 shell 中可用,并且可以修改?

导出一个环境变量以在所有子 shell 中可用,并且可以修改?

假设我有

export MY_VAR=0

~/.bashrc

我有一个打开的 gnome 终端,在这个终端中,我将$MY_VAR值更改为200.所以,如果我这样做

echo $MY_VAR

在此终端中,200显示。

现在,我在 gnome 终端中打开了另一个选项卡,然后执行

echo $MY_VAR

...而不是200,我有0

当终端修改环境变量时,我应该怎么做才能保留 200 值,使此修改(设置为 200)可用于所有后续子 shell 等?这可能吗?

答案1

A复制环境的传播到子 shell,所以这是有效的:

$ export MY_VAR=200
$ bash
$ echo $MY_VAR
200

但由于它是一个副本,因此您无法将该值传递给父 shell — 至少不能通过更改环境来获取。

听起来您实际上想更进一步,即创建一些类似于全局变量的东西,由与父级分开启动的“兄弟”shell 共享 - 就像 Gnome 终端中的新选项卡一样。

大多数情况下,答案是“你不能,因为环境变量不能那样工作”。然而,还有另一个答案,那就是,你总是可以破解一些东西。一种方法是将变量的值写入文件,例如~/.myvar,然后将其包含在~/.bashrc.然后,每个新的 shell 都会开始以及从该文件读取的值。

您可以更进一步 -~/.myvar使用 format MYVAR=200,然后设置PROMPT_COMMAND=source ~/.myvar,这将导致每次收到新提示时重新读取该值。仍然不是相当一个共享的全局变量,但它开始像它一样工作。不过,在提示返回之前它不会激活,这取决于您想要执行的操作可能是一个严重的限制。

然后,当然,接下来的事情就是自动更改为~/.myvar.这变得有点复杂,我将在此停止,因为实际上,环境变量并不意味着成为 shell 间通信机制,最好找到另一种方法来做到这一点。

答案2

假设我有export MY_VAR=0~/.bashrc.

那就是你的错误。您应该在 中定义环境变量~/.profile,该变量在您登录时读取。~/.bashrc每次启动 shell 时都会读取该变量;当您启动内壳时,它会覆盖MY_VAR.如果您没有这样做,您的环境变量将向下传播。

有关~/.bashrcvs 的更多信息~/.profile,请参阅我的以前的 帖子 话题

注意向上传播(从子 shell 获取修改后的值自动反映在父 shell 中)是不可能的,完全停止。

答案3

鱼壳可以做到这一点:

set -U MY_VAR 0

(看http://fishshell.com/docs/current/commands.html#set

要从另一个 shell 执行 Fish 命令,您可以运行fish -c,例如:

fish -c "set -u MY_VAR 0"

答案4

当我刚刚用谷歌搜索这个问题时,我试图解决从子 shell 之外更新状态(即 shell 变量)的问题。这样就可以在管道内部分配变量,并且分配对父级是透明可见的。

当然,这不可能以简单的方式实现,因为管道的各个部分是在子 shell 中执行的,这些子 shell 是fork从父 shell 中执行的,因此具有以下内存:写时复制查看父母的记忆。但是,我认为基于“的纤薄且透明的解决方案是可能的”共享内存“ 有点工控机

我什至找到了一个执行正是这个设计......但它是用 Perl 编写的。

无论如何添加这个答案作为可能的解决方案。

相关内容