假设我有
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
答案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"