我可以在同一工作流程(shell 会话)中将 ksh/zsh 和其他 shell 与 Bash 结合使用吗?
我习惯了 Bash,但我可能需要 ksh 或 zsh 中可用的一些行为。我可以在单个 shell 会话中以某种方式与它们一起使用 Bash,至少在它们不会发生冲突的情况下吗?
这里没有要解决的问题,只是一个架构问题,以便更好地了解 shell 之间的关系和常识。
答案1
这里可能有两个问题:
- 我可以用多种 shell 变体编写脚本并将它们一起使用吗?
- 我可以为一个 shell 变体编写一个脚本并由另一个 shell 解释器执行它吗?
对于第一个问题:
是的,只要脚本由为其编写的 shell 解释器执行即可。请注意,您使用什么 shell 并不重要交互的只要脚本具有正确的#!
行和/或使用显式解释器执行(例如ksh myscript
),就可以工作。
脚本的工作方式就像您(或其他人)编写的命令一样。另一个脚本可以调用它,无论它是用什么语言编写的(假设它是可执行的并且具有正确的#!
-line)。
对于第二个:
如果您仅使用语法和语法方面的最低公分母(在这三个 shell 的情况下是 POSIX sh
)编写脚本,您可以相当确信它们将在所有这些 shell 下运行(但我假设可能存在边缘情况,其中一个 shell 可能缺乏 POSIX 一致性)。但是,当您也可以使用 来运行脚本时,为什么还要拥有zsh
或ksh
运行它呢?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