我可以生成一个克隆当前终端的新终端吗?

Joh*_*man 8 shell terminal environment-variables

因此,假设我正在目录 /asdf/qwer/dfgh/wert/asdf/qwer 中开发代码,并且我在路径中添加了大约三个这样的目录,并且设置了一堆神秘的环境变量。然后我意识到我真的需要打开另一个终端并以同样的方式设置(尽管这种需求不会再次发生,所以我只会更改我的 .bashrc)。是否有任何命令可以打开一个新的终端窗口,它是这个终端窗口的精确克隆?

Jan*_*der 13

如果您可以从命令行运行终端程序,则克隆路径很容易。假设您正在使用xterm,只需xterm &从您要克隆的终端的提示符处运行。新的 xterm 将在同一目录中启动,除非您将其配置为作为登录 shell 启动。任何导出的环境变量也会结转,但未导出的变量不会。

克隆整个环境(包括未导出的变量)的一种快速而肮脏的方法如下:

# from the old shell:
set >~/environment.tmp

# from the new shell:
. ~/environment.tmp
rm ~/environment.tmp
Run Code Online (Sandbox Code Playgroud)

如果您设置了任何自定义 shell 选项,则还必须重新应用这些选项。

您可以将整个过程包装成一个易于运行的脚本。让脚本将环境保存到已知文件,然后运行xterm. 让您的 .bashrc 检查该文件,并获取它并在找到时将其删除。


或者,如果您不想从另一个终端启动一个终端,或者只是想要更多控制,您可以使用您在 .bashrc 中定义的一对函数:

putstate () {
    declare +x >~/environment.tmp
    declare -x >>~/environment.tmp
    echo cd "$PWD" >>~/environment.tmp
}

getstate () {
    . ~/environment.tmp
}
Run Code Online (Sandbox Code Playgroud)

编辑:更改putstate为复制 shell 变量的“导出”状态,以便匹配其他方法。还有其他一些内容也可以复制,例如 shell 选项(请参阅 参考资料help set)——因此该脚本还有改进的余地。