自动将所有环境变量从一个 shell 转移到另一个 shell

Cas*_*dra 3 linux bash shell ksh zsh

我想将一个 shell(在我的例子中:kornshell)的所有环境变量自动转移到另一个 shell(在我的例子中:z-shell)。

如果可能的话,传输应该在 zshell 的启动文件中,以避免使用额外的脚本,因为我想将它传输到其他服务器以达到同样的目的。

到目前为止我尝试过的:

  1. 放入$ export $(ksh -c env | tr '\n' ' ').zshrc (Zshell 的启动文件)。

    这是行不通的,因为该命令是作为当前 shell (zsh) 的子级执行的,因此它具有与 zsh 相同的环境变量,而不是 kornshell 的环境。

  2. 在额外的脚本中

    #!/usr/bin/ksh
    echo $(ksh -c env | tr '\n' ' ') # for testing if it works
    export $(ksh -c env | tr '\n' ' ')
    
    Run Code Online (Sandbox Code Playgroud)

    这也不行。

任何评论都非常感谢。

jhn*_*lmn 5

export $(ksh -c env | tr '\n' ' ')
Run Code Online (Sandbox Code Playgroud)

对我不起作用,因为“env”返回如下文本:

key1=value1 value2
...
Run Code Online (Sandbox Code Playgroud)

所以上面的命令将展开 $(ksh -c env | tr '\n' ' ') 并运行:

export key1=value1 value2
Run Code Online (Sandbox Code Playgroud)

但这会产生错误:

export: value2: is not an identifier
Run Code Online (Sandbox Code Playgroud)

注意“env”的输出中“=”符号右侧可能还有其他坏字符,会产生错误。

但是有一个更好的方法来导出环境:

 export -p > myenv.sh
Run Code Online (Sandbox Code Playgroud)

这在 Bash 中输出

 declare -x key1="value1 value2"
 ....
Run Code Online (Sandbox Code Playgroud)

Bash“declare -x”似乎与“export”相同。但是在 ksh "export -p" 打印

export key1='value1 value2'
...
Run Code Online (Sandbox Code Playgroud)

现在我只需要运行

source myenv.sh 
Run Code Online (Sandbox Code Playgroud)

导出所有变量

但我还需要在导出新变量之前删除所有现有变量。我在以下位置找到了解决方案:http : //www.linuxquestions.org/questions/linux-newbie-8/how-to-unset-environment-variable-in-bash-383066/

所以,我的最终代码是:

unset `env | awk -F= '/^\w/ {print $1}' | xargs`
source myenv.sh
Run Code Online (Sandbox Code Playgroud)