我可以假设已经zsh
安装了足够多的人来运行脚本吗
#!/usr/bin/env zsh
作为舍邦?
或者这会使我的脚本无法在太多系统上运行?
澄清:我对最终用户可能想要运行的程序/脚本感兴趣(例如在 Ubuntu、Debian、SUSE、Arch 等上)。
答案1
为了便携性,没有。虽然zsh
至少可以通过 Cygwin 在任何 Unix 或类 Unix 甚至 Windows 上编译,并且为大多数开源类 Unix 和一些商业类打包,但它通常不包含在默认安装中。
bash
另一端安装在 GNU 系统上(就像bash
GNU 项目的外壳一样),就像大多数非嵌入式 Linux 系统一样,有时也安装在非 GNU 系统上,例如 Apple OS/X。在商业 Unix 方面,Korn shell(AT&T 的变体,尽管更多ksh88
)是标准的,bash
并且两者zsh
都在可选包中。在 BSD 上,首选的交互式 shell 通常是tcsh
基于sh
Almquist shell 的,或者pdksh
也bash
需要zsh
作为可选包安装。
zsh
默认情况下安装在 Apple OS/X 上。它甚至曾经是/bin/sh
那里。默认情况下,它可以在一些 Linux 发行版中找到,例如 SysRescCD、Grml、Gobolinux 以及可能的其他发行版,但我认为没有任何主要发行版。
与 一样bash
,存在安装版本的问题以及可用功能的问题。例如,带有bash3
或 的系统并不罕见zsh3
。此外,无法保证您现在编写的脚本zsh5
能够正常工作zsh6
,尽管bash
它们确实尝试保持向后兼容性。
对于脚本,我的观点是:使用 POSIX shell 语法,因为所有 Unice 至少有一个名为sh
(不一定是 in /bin
)的 shell 能够解释该语法。那么你就不用太担心便携性了。如果该语法不足以满足您的需要,那么您可能需要的不仅仅是 shell。
然后,您的选择是:
- Perl 无处不在(尽管您可能不得不将自己限制在旧版本的功能集上,并且不能对默认安装的 Perl 模块做出假设)
- 指定解释器及其版本(python 2.6 或更高版本、zsh 4 或更高版本、bash 4.2 或更高版本...)作为脚本的依赖项,方法是为指定依赖项的每个目标系统构建一个包,或者通过规定它在与脚本一起提供的自述文件中或作为注释嵌入在脚本顶部,或者在脚本开头添加几行 Bourne 语法,检查所请求的解释器的可用性并通过显式错误来解决当它不是时,就像此脚本需要 zsh 4.0 或更高版本。
- 将解释器与您的脚本一起提供(注意许可问题),这意味着您还需要为每个目标操作系统提供一个软件包。一些解释器通过提供一种将脚本及其解释器打包在单个可执行文件中的方法来使其变得更容易。
- 用编译语言编写它。同样,每个目标系统一个包。
答案2
你不能。保证可用的是/bin/sh
,本质上是原始的 Bourne shell。几乎所有(注意“几乎”!)Linux 安装都会有 bash,但在 *BSD 系统上很少见(BSD 派对 GPL 代码有严重的疑虑,比如 bash)。我不知道 Mac 上的标准 shell 是什么,但再次对 GPL 存有疑虑。对于 Solaris 来说也是如此。
zsh 是一个小众 shell,它不在 Fedora 的默认安装中(而且我不相信它是任何主要发行版的默认安装)。
答案3
我认为这真的取决于什么嘚您正在使用的额外功能以及在何处使用。如果您打算在不同的用户和系统之间分发脚本,我建议使用巴什甚至嘘。
同时,如果您的脚本设计为在整个组织中执行并且您有约定嘚在您的机器上(例如相同的基本 AMI),并且您的任务可以从高级文件选择器或其他内容等扩展中获得明显的好处http://www.rayninfo.co.uk/tips/zshtips.html我会说继续吧!
答案4
您几乎可以保证的唯一一件事就是存在一个/bin/sh
.这可能是一个实际静态链接的 shell,也可能是到另一个 shell 的链接。另一个 shell 通常会检测到它被称为 sh 并将在兼容模式下运行。
注意几乎在第一句话中。
我工作过的每一个类 UNIX 系统都有它。他们中的许多人还安装了 bash(但是不是全部其中。例如,bash 在某些 BSD 上默认不安装。一些 Linux 发行版附带短跑,改为 Debian Almquist shell。
您可以保证的是您的安装说明。您可以在 README 文件中添加一行,说明需要 zsh。如果您构建一个包,那么您可以将 zsh 标记为依赖项。您可以使用 autoconf/automake 工具检查它。您可以检查安装脚本中是否找到 zsh(从 /bin/sh 开始并尝试找到 zsh,如果找到则继续。如果没有则显示错误。例如“警告:ZSH 未安装。请阅读安装说明文件! ”。)
我确信我忘记了更多选项。但关键点是:
- 在您检查之前,您无法做出任何保证。
- 几乎可以保证 /bin/sh 存在,并且您可以对其进行一些检查。