有什么方法可以复制当前 shell 并在该特定 shell 中设置所有环境变量吗?
var1
考虑一个我已初始化变量、var2
和的 shell var3
。理想情况下,变量值不会被新 shell 所知,例如终端仿真器中单独(新)选项卡中的 shell。我想根据当前 shell 中设置的变量创建当前 shell 的副本。这可能吗?
答案1
如果只是关于 Bash 中的变量(问题被标记为狂欢),这个 Ask Ubuntu 答案是一个很好的起点:
您可以使用
declare
内置命令查看所有变量。declare -p
如果你只对环境变量感兴趣,请使用
declare -xp
运行
help declare
以查看其他选项。
输出具有正确的语法,因此出现以下解决方案:
在源 Bash 会话中运行
declare -p > ~/some_file
在目标 Bash 会话中运行
. ~/some_file 2>/dev/null
笔记:
- 某些变量(例如
PPID
或标有 的变量declare -r
)是只读的,如果您尝试在不使用 的情况下在目标会话中设置它们,则会收到一些警告2>/dev/null
。此重定向仅用于抑制此类警告。目标会话中为只读的变量将保持不变。 - 目标会话和文件中存在的几乎所有变量都将被文件中的值覆盖。例外情况如下:
- 目标 shell 中变量已标记为只读;
GROUPS
或之类的变量RANDOM
是特殊的(man 1 bash
有关详细信息,请参阅);据我所知,declare -p
它们会以不同的方式处理,因此它们在目标 shell 中保持特殊状态。
任何存在于目标会话但不存在于文件中的变量都将保持不变。
为了尽可能多地删除目标 shell 中的“旧”变量,请在获取文件之前使用此命令:
exec env -i bash --noprofile --norc
它启动时
bash
既不读取启动文件也不读取初始化文件(--noprofile --norc
),在一个空的环境中(env -i
)。此外,newbash
会替换当前 shell(exec
),这样两个进程就不会不必要地堆叠(前提是当前目标 shell 无论如何都是可消耗的)。实际上,您可以启动一个新文件
bash
并使用一个命令让它提供文件来源:exec env -i bash --noprofile --rcfile ~/some_file
因此,一般来说,目标会话不会成为完全相同的副本。不过,如果您只需要传输在源会话中手动设置的变量,那么这种方法可能就足够了。