在 Unix 中,shell 脚本和可执行文件有什么区别?

Gee*_*eek 9 executable shell-script terminology

在这个网站上看到过这个问题,这促使我提出这个问题。我想知道在 Unix 中说可执行文件和 shell 脚本有什么区别?

Chr*_*own 12

可执行文件是指任何设置了可执行位的文件都可以执行(即使程序实际运行中出现错误)。

shell 脚本是一种特定类型的可执行文件,旨在由 shell 使用#!指令指定解释器来解释。


Gil*_*il' 12

一个脚本是一个文件,该文件:

  • 是人类可读的(至少对于经过合理训练的人来说,即文件由可打印的字符组成);和
  • 解释器理解为描述程序行为的指令。

一个shell脚本是一个脚本,其解释为一个。在 unix 世界中,“shell”是指类似于Bourne shell 的 shell家族;现代此类 shell(ash、bash、ksh、zsh 等)符合POSIX shell 标准。更一般地说,“shell”一词可以包括其他命令解释器,例如 csh、tcsh、fish……


一个可执行文件是可以执行的任何文件。为了有效地可执行,文件需要有两个属性:

  • 用户必须具有执行它的权限。这可以通过命令看到ls -lx字符必须出现在权限列中。
  • 该文件的格式必须是系统识别为可执行文件的格式。可执行格式可以分为几类:

    • 本机可执行文件,由根据操作系统的二进制可执行文件布局组织的机器代码组成。大多数现代 Unix 系统为其原生可执行文件使用ELF格式。
    • 脚本。可执行脚本是一个以shebang行开头的文件,由两个字符组成,#!后跟文件路径。为了执行这样的文件,内核执行解释器程序并将脚本的路径作为参数传递给它。
    • 可能是其他格式,具体取决于系统。例如,Linux 可以通过binfmt_misc工具注册任意文件格式。这允许通过注册的JVM执行 Java 字节码文件,通过Wine执行 Windows 可执行文件等。

请注意,作为可执行文件取决于系统。例如,amd64 Linux 二进制文件可在 amd64 Linux 系统上执行,但不能在 32 位系统上执行。Android 的二进制文件不能在正常的 Linux 安装上执行。如果 Wine 存在,Windows 可执行文件只能在 Linux 上执行。以 开头的脚本#!/usr/local/bin/ruby只有在程序位于 时才可执行/usr/local/bin/ruby


shell 脚本通常是可执行的。但是如果您没有执行它的权限,它可以是不可执行的。你仍然可以通过将它显式地传递给解释器来解释它(例如bash /path/to/script)——“让它被解释”是说“执行”的一种奇特的方式。