我可以产生一个新终端,它是当前终端的副本吗?


8

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

Answers:


10

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

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

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

# from the new shell:
. ~/environment.tmp
rm ~/environment.tmp

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

您可以将整个过程包装到易于运行的脚本中。让脚本将环境保存到已知文件,然后运行xterm。让您的.bashrc检查该文件,并将其来源并删除(如果找到)。


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

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

getstate () {
    . ~/environment.tmp
}

编辑:更改,putstate以便它复制外壳程序变量的“导出”状态,以便与其他方法匹配。还可以复制其他东西,例如shell选项(请参阅参考资料help set)-因此该脚本还有改进的余地。


哇...很酷的解释,使我获得了一些以前的见解。
John Berryman

我修改了您的脚本以接受一个参数,然后将put放置到该参数命名的文件中,然后将环境放置到文件中...现在我可以拥有多个环境了!:D
John Berryman

问题:“。”是什么?在getstate中做?
约翰·贝里曼

“。” 说,“使用当前shell运行该文件的内容,就像在命令行中键入它们一样”。如果没有“。”,将有一个新的副本bash运行该文件中的命令,然后退出,并且当前shell的环境不会更改。
詹德(Jander)

0

如果screen在定义的环境中启动(GNU屏幕),则该环境将由子流程(即screen)使用,您可以使用它来产生新的终端。但是,如果您想再次分叉它(在screenscreen),则开始变得很棘手。


0

在类似的情况下,我还发现在与当前目录相同的目录中启动新shell很有用。我使用了这样的食谱来启动外壳。

exec ssh -t $HOST "cd $DIR; $SHELL $parms"

每当您使用ssh明确运行shell时,都需要-t选项。它导致为该进程创建一个伪tty。这对于历史命令和其他交互功能正常工作是必需的。脚本中较早的行将DIR设置为当前目录,并将SHELL设置为用户的首选Shell。


0

虽然导出的变量使用上面的“ getstate”函数将其移到另一端,但由于某种原因,它们最终没有被导出到那里(可以从python中使用简单的os.getenv看到)。将getstate修改为别名时,对我来说似乎更好:

alias getstate=". ~/environment.tmp"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.