如何将变量复制到新的 Linux shell?

如何将变量复制到新的 Linux shell?

有什么方法可以复制当前 shell 并在该特定 shell 中设置所有环境变量吗?

var1考虑一个我已初始化变量、var2和的 shell var3。理想情况下,变量值不会被新 shell 所知,例如终端仿真器中单独(新)选项卡中的 shell。我想根据当前 shell 中设置的变量创建当前 shell 的副本。这可能吗?

答案1

如果只是关于 Bash 中的变量(问题被标记为),这个 Ask Ubuntu 答案是一个很好的起点:

您可以使用declare内置命令查看所有变量。

declare -p

如果你只对环境变量感兴趣,请使用

declare -xp

运行help declare以查看其他选项。

输出具有正确的语法,因此出现以下解决方案:

  1. 在源 Bash 会话中运行

    declare -p > ~/some_file
    
  2. 在目标 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
    

因此,一般来说,目标会话不会成为完全相同的副本。不过,如果您只需要传输在源会话中手动设置的变量,那么这种方法可能就足够了。

相关内容