$ 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
这里可能有两个问题:
对于第一个问题:
是的,只要脚本由为其编写的 shell 解释器执行。请注意,只要脚本具有正确的-lines 和/或使用显式解释器(例如 )执行,您使用什么 shell 进行交互工作并不重要。
#!
ksh myscript
脚本就像您(或其他人)编写的命令一样工作。另一个脚本可以调用它,无论它是用什么语言编写的(假设它是可执行的并且具有正确的
#!
-line)。对于第二个:
如果您仅使用语法和语法方面的最低公分母(在这三个 shell 的情况下是 POSIX
sh
)编写脚本,您可以相当肯定它们将在所有这些 shell 下运行(但我假设那里可能是缺少一个 shell 的 POSIX 一致性的极端情况)。但是,当您可以使用 运行脚本时,为什么还要拥有zsh
或ksh
运行脚本呢?sh
/bin/sh
ksh93
并且bash
(可能也zsh
一样,但我不太精通那个 shell)确实在它们对 plain 的扩展中提供了相当多的共性sh
,但是在某些情况下,即使语法和语义看似一致,奇怪的问题源于其他差异。在一般情况下,不,您不能假设一个 shell 将能够成功且正确地运行为另一个 shell 编写的脚本。例如,
bash
脚本可以像使用任何其他命令一样使用ksh
脚本,但绝不应该source
使用ksh
脚本。理想情况下,您应该假设不同的 shell 是完全不同的脚本语言,并为特定的 shell 编写,就像您不会编写一段 Python 代码并期望它在 Perl 或 Ruby 下运行(除非它是一些人为的多语言脚本) .
作为肯定的简单示例: