用于交互式和非交互式工作的不同 shell

用于交互式和非交互式工作的不同 shell

由于我工作场所的限制,每个用户的默认 shell 都是tcsh,并且我需要使用它tcsh作为我的非交互式 shell(即我们在 init 文件中跨项目进行大部分环境配置tcsh)。不过,我喜欢使用它zsh作为我的交互式 shell。

为了继承tcsh切换到 zsh 时的环境zsh,我通常首先在 中启动交互式 shell tcsh,然后使用 切换到 zsh exec zsh。这似乎运作良好。

但是,有时我们更新tcsh初始化文件,我需要相应地刷新我的环境从跑步zsh壳。我相信解决这个问题的最佳方法是切换到tcshsource 的 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

但我想知道几件事:

  1. 有没有办法塌陷

    > exec tcsh
    > exec zsh
    

    变成一个命令?我尝试过:

    > exec tcsh; zsh
    > exec tcsh; exec zsh
    

    但它们似乎都不起作用。唯一有效的似乎是

    > exec tcsh & exec zsh
    

    但我不确定这是否符合我的需要。

  2. 还有哪些其他方法可以完全重新启动我的交互式 shell,同时重新配置我的非交互式环境(即就像我再次登录一样然后tcsh切换到 zsh)

  3. 更一般地说,使用不同的 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 失败,而没有处理至少部分输出。

答案2

我假设非交互式 shell 用于脚本执行。

表达脚本需要特殊解释器的最简单方法是使用舍邦,例如作为脚本的第一行:

#!/usr/bin/tcsh

相关内容