由于我工作场所的限制,每个用户的默认 shell 都是tcsh
,并且我需要使用它tcsh
作为我的非交互式 shell(即我们在 init 文件中跨项目进行大部分环境配置tcsh
)。不过,我喜欢使用它zsh
作为我的交互式 shell。
为了继承tcsh
切换到 zsh 时的环境zsh
,我通常首先在 中启动交互式 shell tcsh
,然后使用 切换到 zsh exec zsh
。这似乎运作良好。
但是,有时我们更新tcsh
初始化文件,我需要相应地刷新我的环境从跑步zsh
壳。我相信解决这个问题的最佳方法是切换到tcsh
source 的 init filts,然后切换回zsh
.
在实践中我采用以下方法
> # Running from a zsh interactive shell.
> # Various tcsh and zsh init files have been updated
> exec tcsh
> exec zsh
> # I am back to zsh with the updated environment
但我想知道几件事:
有没有办法塌陷
> exec tcsh > exec zsh
变成一个命令?我尝试过:
> exec tcsh; zsh > exec tcsh; exec zsh
但它们似乎都不起作用。唯一有效的似乎是
> exec tcsh & exec zsh
但我不确定这是否符合我的需要。
还有哪些其他方法可以完全重新启动我的交互式 shell,同时重新配置我的非交互式环境(即就像我再次登录一样然后
tcsh
切换到 zsh)更一般地说,使用不同的 shell 进行交互式和非交互式工作并确保交互式 shell 从非交互式 shell 的环境开始? (可以在交互式 shell 的初始化文件中修改此环境的位)
答案1
您可以将 2 个 exec 命令折叠为单个命令,如下所示:
exec tcsh -c zsh
您可以使用以下命令更新当前 zsh 进程中的环境:
eval $(env -i tcsh -c env)
使用env -i
将导致以下命令在空环境中运行。这会运行 tcsh 来处理启动文件。然后 tcsh 的选项-c
运行 的另一个副本env
,但这次没有命令,因此它只打印 tcsh 设置的环境的当前内容。然后导致eval $(...)
zsh 解析该输出。
在我的测试中,需要使用env -i
来防止 zsh 尝试设置自己设置的环境变量,包括_
只读变量。该尝试导致 eval 失败,而没有处理至少部分输出。