假设我正在目录 /asdf/qwer/dfgh/wert/asdf/qwer 中开发代码,并且我在我的路径中添加了大约三个类似的目录,并且设置了一堆神秘的环境变量。然后我意识到我确实需要打开另一个终端并以同样的方式进行设置(尽管这种需要不会再次出现,因此我只需更改我的 .bashrc)。是否有任何命令可以打开一个与此窗口完全相同的新终端窗口?
答案1
如果可以从命令行运行终端程序,则克隆路径会很容易。假设您正在使用xterm
,只需xterm &
从要克隆的终端的提示符处运行即可。新的 xterm 将在同一目录中启动,除非您将其配置为作为登录 shell 启动。任何导出的环境变量也将保留,但未导出的变量不会。
克隆整个环境(包括未导出的变量)的一种快速而肮脏的方法如下:
# from the old shell:
set >~/environment.tmp
# from the new shell:
. ~/environment.tmp
rm ~/environment.tmp
如果您设置了任何自定义 shell 选项,则还必须重新应用这些选项。
您可以将整个过程包装到一个易于运行的脚本中。让脚本将环境保存到已知文件中,然后运行xterm
.让您的 .bashrc 检查该文件,并获取它,如果找到则将其删除。
或者,如果您不想从另一个终端启动一个终端,或者只是想要更多控制,您可以使用在 .bashrc 中定义的一对函数:
putstate () {
declare +x >~/environment.tmp
declare -x >>~/environment.tmp
echo cd "$PWD" >>~/environment.tmp
}
getstate () {
. ~/environment.tmp
}
编辑:更改putstate
为复制 shell 变量的“导出”状态,以便与其他方法匹配。还可以复制其他内容,例如 shell 选项(请参阅 参考资料help set
)——因此该脚本还有改进的空间。
答案2
如果您screen
在定义的环境中启动(GNU Screen),则该环境将由子进程(即screen
)使用,并且您可以使用它来生成新终端。但如果你想再次分叉它(a screen
in a screen
),它就开始变得棘手。
答案3
在类似的情况下,我还发现在与当前 shell 相同的目录中启动新 shell 很有用。我使用这样的配方来启动外壳。
exec ssh -t $HOST "cd $DIR; $SHELL $parms"
每当您使用 ssh 显式运行 shell 时,都需要 -t 选项。它会导致为该进程创建一个伪 tty。这是历史命令和其他交互功能正常工作所必需的。脚本中的前面几行将 DIR 设置为当前目录,将 SHELL 设置为用户首选的 shell。
答案4
虽然导出的变量使用上面的“getstate”函数到达另一侧,但由于某种原因,它们最终没有被导出到那里(正如使用 python 中的简单 os.getenv 可以看到的那样)。将 getstate 修改为别名时,它似乎对我来说效果更好:
alias getstate=". ~/environment.tmp"