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


Answers:


12

可执行文件是指具有可执行位的任何文件,可以执行该文件(即使程序的实际运行中存在错误)。

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


12

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

  • 是人类可读的(至少对于经过适当培训的人员而言,即文件由可打印的字符组成);和
  • 解释器将其理解为描述程序行为的指令。

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


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

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

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

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


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


2

外壳脚本:

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

脚本名称可以但不必以“ .sh”或“ .bash”或“ .csh”等结尾(提示应启动的shell)。

为了清楚起见,我假设:脚本名称为script,启动脚本的外壳为bash

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

可以也可以设置+ X(可执行文件),允许直接从您当前的shell会话启动它:/绝对/路径/到/的/脚本(或./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查看一些示例。


您关于当前shell正在运行的shebangless脚本的说法是错误的。该行为取决于操作系统。通常,使用POSIX Shell或您的登录Shell。
jlliagre 2012年

感谢您的精确度。我将编辑我的答案以添加您的评论。
奥利维尔·杜拉克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.