shell 脚本头以获得最佳兼容性

ead*_*ter 14 shell-script shebang

哪一个更好:

  • #!/usr/bin/env sh
  • #!/bin/sh
  • 空/无标题

我曾经认为第一个是最好的,无论如何我发现在一些基于 Linux 的系统(如 Android)上缺少路径名,所以现在我认为拥有“可移植”shell 脚本的唯一方法是不包括任何标题...

gho*_*oti 8

对于可移植性,您可以放心地假设它#!/bin/sh会在任何标准 Unix 或 Linux 系统上找到一个主要符合 POSIX 的 shell,但仅此而已。

在 FreeBSD、OpenBSD 和 NetBSD(以及 DragonFly、PC-BSD 和其他一些衍生产品)中,bash 位于/usr/local/bin/bash(如果已安装),因此该/usr/bin/env方法提供了 Linux 和 BSD 之间的可移植性。

Android 不是标准的 Unix 或 Linux 系统。在我的非 root 安卓手机上,没有/usr/bin/env/bin/bash甚至不/bin/sh存在,系统外壳是/system/bin/sh.

缺少#!(shebang)的 shell 脚本将尝试在某些系统上调用它的 shell 中运行,或者可能/bin/bash在其他系统上使用不同的默认解释器(例如)。虽然可能适用于 Android,但不能保证适用于其他操作系统,在这些操作系统中,用户可能会选择使用不是bash. (我在 FreeBSD 中使用 tcsh,它是默认的 shell,并且无shebang 的脚本由调用的 shell 解释。)

所以从我的角度来看,似乎不可能创建一个可在 Android 和非 Android(Linux 或 Unix)系统之间移植的 shell 脚本,因为 Android 的处理方式不同。

  • 这里有几个错误。这里还有很多(主要是商业的)Unices(大多数是 Solaris 10 及之前),其中 `/bin/sh` 是 Bourne shell,而不是 POSIX shell,POSIX 没有指定 `sh` 的路径。大多数 shell(和 `execp`/`env`/`find -exec...`)会用系统的 `sh` 解释一个没有 she-bang 的脚本,很少有人用自己来解释它,当他们这样做时,他们会这样做在 POSIX 兼容模式下。这是运行脚本的标准/POSIX 方式,但假设调用者处于 _POSIX 环境_。 (2认同)