我可以在同一工作流程中将 ksh/zsh 和其他 shell 与 Bash 结合使用吗?

我可以在同一工作流程中将 ksh/zsh 和其他 shell 与 Bash 结合使用吗?

我可以在同一工作流程(shell 会话)中将 ksh/zsh 和其他 shell 与 Bash 结合使用吗?

我习惯了 Bash,但我可能需要 ksh 或 zsh 中可用的一些行为。我可以在单个 shell 会话中以某种方式与它们一起使用 Bash,至少在它们不会发生冲突的情况下吗?

这里没有要解决的问题,只是一个架构问题,以便更好地了解 shell 之间的关系和常识。

答案1

这里可能有两个问题:

  1. 我可以用多种 shell 变体编写脚本并将它们一起使用吗?
  2. 我可以为一个 shell 变体编写一个脚本并由另一个 shell 解释器执行它吗?

对于第一个问题:

是的,只要脚本由为其编写的 shell 解释器执行即可。请注意,您使用什么 shell 并不重要交互的只要脚本具有正确的#!行和/或使用显式解释器执行(例如ksh myscript),就可以工作。

脚本的工作方式就像您(或其他人)编写的命令一样。另一个脚本可以调用它,无论它是用什么语言编写的(假设它是可执行的并且具有正确的#!-line)。

对于第二个:

如果您仅使用语法和语法方面的最低公分母(在这三个 shell 的情况下是 POSIX sh)编写脚本,您可以相当确信它们将在所有这些 shell 下运行(但我假设可能存在边缘情况,其中一个 shell 可能缺乏 POSIX 一致性)。但是,当您也可以使用 来运行脚本时,为什么还要拥有zshksh运行它呢?sh/bin/sh

ksh93并且bash(也可能zsh,但我不太熟悉那个外壳)在它们对普通的扩展中确实提供了相当多的通用性sh,但在某些情况下,即使语法和语义看似一致,其他差异引起奇怪的问题

在一般情况下,不,您不能假设一个 shell 能够成功且正确地运行为另一个 shell 编写的脚本。例如,一个bash脚本可以使用一个ksh脚本,就像它是任何其他命令一样,但它绝不应该是source一个ksh脚本。

理想情况下,您应该假设不同的 shell 是完全不同的脚本语言,并为特定的 shell 编写,就像您所做的那样不是编写一段 Python 代码并期望它在 Perl 或 Ruby 下运行(除非它是一些人为的)多语言脚本)。

答案2

举一个简单的肯定的例子:

$ echo $SHELL
/bin/bash
$ for othershell in ash dash posh rksh bash ksh zsh; 
  do 
    $othershell -c "echo Hello from the $othershell"; 
  done
Hello from the ash
Hello from the dash
Hello from the posh
Hello from the rksh
Hello from the bash
Hello from the ksh
Hello from the zsh

相关内容