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

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

我见过这个网站上的这个问题这促使我提出这个问题。我想知道在 Unix 语言中可执行文件和 shell 脚本之间的区别是什么?

答案1

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

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

答案2

A脚本是一个文件:

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

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


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

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

    • 本机可执行文件,由根据操作系统的二进制可执行文件布局组织的机器代码组成。大多数现代 UNIX 系统都使用极低频其本机可执行文件的格式。
    • 脚本。可执行脚本是一个以舍邦行,由两个字符组成,#!后跟文件路径。为了执行这样的文件,内核执行解释程序并将脚本的路径作为参数传递给它。
    • 可能是其他格式,具体取决于系统。例如,Linux可以通过以下方式注册任意文件格式binfmt_misc设施。这允许 Java 字节码文件通过注册的执行虚拟机, Windows 可执行文件通过葡萄酒, ETC。

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


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

答案3

shell脚本:

shell 脚本是由 shell 解释的一系列命令(通常是 sh 或与 sh 兼容的 shell,有时是另一个。)

脚本名称可以但不需要以“.sh”或“.bash”或“.csh”等结尾(提示应通过哪个 shell 启动它)。

为了清楚起见,我假设:脚本名称是script,并且应该在其中启动的 shell 是bash

在 shell 中启动它的典型方法是 :bash /absolute/path/to/the/scriptbash ./relative/path/to/the/script。这样,它就不需要设置可执行位,因为它只能由 bash 读取,然后执行内容。

还可以设置 +x(可执行文件)以允许直接从当前 shell 会话启动它:/absolute/path/to/the/script(或 ./relative/path/to/the/script)。注意:默认情况下,当以这种方式启动时,它是通过您输入的 shell 启动的或者通过 posix shell(行为取决于操作系统),因此它可能不是它应该运行的 shell。这就是为什么您可以(并且应该)指定为脚本的第一行: #!/path/to/good/shell ,它向您的操作系统指示该脚本实际上应该由 /path/to/good/shell 启动。

可执行文件:

可执行文件是一个为应该启动的用户/组设置了“x”位的文件。它通常可以是“二进制文件”或脚本。

提示:file /some/file可以告诉您有关文件内容的更多信息。尝试file /usr/bin/bashfile /etc/profile看一些例子。

相关内容