我见过这个网站上的这个问题这促使我提出这个问题。我想知道在 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/script
或bash ./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/bash
或 file /etc/profile
看一些例子。