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

Linux 自动将所有环境变量从一个shell转移到另一个shell,linux,bash,shell,ksh,zsh,Linux,Bash,Shell,Ksh,Zsh,我希望将一个shell(在我的示例中为kornshell)的所有环境变量自动传输到另一个shell(在我的示例中为z-shell) 如果可能,传输应该在zshell的启动文件中,以避免使用其他脚本,因为我希望将其传输到其他服务器以达到相同的目的 到目前为止,我尝试的是: 将$export$(ksh-c env | tr'\n'')放入.zshrc(Zshell的启动文件)中 这不起作用,因为该命令是作为当前shell(zsh)的子命令执行的,因此该shell具有与zsh相同的环境变量,而不是ko

我希望将一个shell(在我的示例中为kornshell)的所有环境变量自动传输到另一个shell(在我的示例中为z-shell)

如果可能,传输应该在zshell的启动文件中,以避免使用其他脚本,因为我希望将其传输到其他服务器以达到相同的目的

到目前为止,我尝试的是:

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

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

  • 用额外的脚本

    #!/usr/bin/ksh
    echo $(ksh -c env | tr '\n' ' ') # for testing if it works
    export $(ksh -c env | tr '\n' ' ')
    
    这也不管用


  • 非常感谢您的评论。

    使用如何/路径/to/your/shell/script.sh以运行脚本。 您可以通过三种不同的方式运行shell脚本, 1)
    /bin/sh/path/to/your/shell/script.sh
    2)
    /path/to/your/shell/script.sh
    3)
    /path/to/your/shell/script.sh
    你可以去看看

    export $(ksh -c env | tr '\n' ' ')
    
    不适用于我,因为“env”返回如下文本:

    key1=value1 value2
    ...
    
    因此,上面的命令将展开$(ksh-c env | tr'\n'')并运行:

    但这会产生错误:

    export: value2: is not an identifier
    
    请注意,“env”输出中“=”符号右侧可能有其他错误字符,这将产生错误

    但有一种更好的出口环境的方法:

     export -p > myenv.sh
    
    export $(env -i ksh -c env | tr '\n' ' ')
    
    这将在Bash中输出

     declare -x key1="value1 value2"
     ....
    
    看起来Bash的“declare-x”与“export”相同。 但在ksh的“出口-p”打印

    现在我只需要跑步

    source myenv.sh 
    
    导出所有变量的步骤

    但我还需要在导出新变量之前删除所有现有变量。 我在以下位置找到了解决方案:

    因此,我的最终代码是:

    unset `env | awk -F= '/^\w/ {print $1}' | xargs`
    source myenv.sh
    

    在空环境中运行您的
    ksh

     export -p > myenv.sh
    
    export $(env -i ksh -c env | tr '\n' ' ')
    

    缩进列表和编号列表不能很好地配合使用。试着用
    1)
    等进行编号。谢谢你,成功了:)@larsmans:是的,他们成功了。列表中应该包含的内容需要缩进4+否则需要空格的内容。逐字记录是8。你能更详细地描述这个用例吗?一方面,传输所有环境变量可能会把事情搞砸(有些是特定于shell的),另一方面,您可能感兴趣的环境变量不是由shell组成的,而是从某个地方读取的,因此确保另一个shell在那里拾取它们可能是更容易的选择。但是需要更多的细节来确定。我正在一个服务器上工作,其中标准shell是kornshell。如果某些变量需要更改,管理员将只更改ksh中的变量。这就是为什么我想在启动zsh时自动读取它们。如果您想使用另一个shell(无法更改kshell配置,因为我不是唯一使用它的人),则需要以某种方式将这些env变量传输到另一个shell。KornShell的.profile文件没有包含我需要的所有环境变量(如DISPLAY、一些SSH_客户端定义等),我不知道如何找到它们。以为这样更容易吗?嘿,乔治。不知道这对解决环境问题有什么帮助。我已经尝试了所有这些,尽管我不确定概念上的差异。这没什么区别。你有没有试过在你的壳里,如果环境。变量是另一个shell的变量吗?问题是父进程(shell)将其环境变量向下传递给任何子进程,无论如何调用(?).source。(点命令)从命令行调用此命令时,将执行脚本。在脚本中,源文件名加载文件名。源文件(点命令)将代码导入脚本,并附加到脚本中(与C程序中的#include指令效果相同)。最终结果与脚本主体中实际存在的“源代码”行相同。这在多个脚本使用公共数据文件或函数库的情况下非常有用。啊,很有趣,谢谢。在命令行中,我使用了./myscript.sh und。或者源代码myscript.sh作为同义词。export$(ksh-c env | tr'\n'')确实输出了export key1=value1 export key2=value2,因此在我的例子中这不是问题所在。但很高兴你也解决了你的问题:)@Cassandra:你写道:“export key1=value1 export key2=value2”,但如果key1的值包含空格或其他特殊字符呢?在您的环境中,“export$(ksh-c env | tr'\n''”)在本例中打印什么?嘿,jhnlmn,我的案例中没有特殊字符。它看起来像上面描述的那样:export-key1=value1 export-key2=value2我的问题是通过先解除环境设置来解决的(正如您所做的那样)。