602

我以前制作过Bash脚本,而且它们#!/bin/bash在开始时都运行良好。

放进去有什么意义?情况会有所不同吗?

还有,你怎么发音#?我知道那!发音为“bang”。

怎么#!发音?

4

10 回答 10

494

这是一个约定,所以 *nix shell 知道要运行什么样的解释器。

例如,旧版本的 ATT 默认使用sh(Bourne shell),而旧版本的 BSD 默认使用csh(C shell)。

即使在今天(大多数系统运行 bash,即“Bourne Again Shell”),脚本也可以是 bash、python、perl、ruby、PHP 等。例如,您可能会看到#!/bin/perl#!/bin/perl5.

PS:感叹号(!)被亲切地称为“砰”。shell 注释符号 ( #) 有时称为“散列”

PPS:请记住 - 在 *nix 下,将后缀与文件类型相关联只是一种约定,而不是“规则”可执行文件可以是二进制程序、一百万种脚本类型中的任何一种以及其他东西。因此需要#!/bin/bash.

于 2012-01-23T06:26:04.073 回答
149

更准确地说,当它是可执行文件模式)文件的前两个字节时, shebangexecve(2)系统调用(执行程序)解释。但是POSIX 规范并没有提到 shebang。#!x execve

它后面必须跟一个解释器可执行文件的文件路径(顺便说一句,它甚至可以是相对的,但大多数情况下是绝对的)。

在用户中找到解释器(例如)的一个好技巧(或者可能不是那么好)是使用程序(在所有 Linux 上总是),例如python$PATHenv/usr/bin/env

 #!/usr/bin/env python

任何 ELF 可执行文件都可以是解释器。您甚至可以使用#!/bin/cat,或者#!/bin/true如果您愿意!(但这通常是无用的)

于 2012-01-23T07:49:58.770 回答
53

它被称为shebang。在 unix-speak 中,# 被称为尖锐(如在音乐中)或哈希(如 twitter 上的主题标签),并且!称为砰。(实际上,您可以使用 !! 引用您之前的 shell 命令,称为 bang-bang)。所以当放在一起时,你会得到haSH-BANG或shebang。

# 之后的部分!告诉 Unix 使用什么程序来运行它。如果未指定,它将尝试使用 bash(或 sh,或 zsh,或任何您的 $SHELL 变量),但如果它在那里,它将使用该程序。另外,# 是大多数语言中的注释,因此该行在后续执行中会被忽略。

于 2012-01-23T06:34:49.627 回答
21

每个发行版都有一个默认的 shell。Bash 是大多数系统的默认设置。如果您碰巧在具有不同默认 shell 的系统上工作,那么如果脚本是专门为 Bash 编写的,那么它们可能无法按预期工作。

多年来,Bash 从kshsh.

添加#!/bin/bash为脚本的第一行,告诉操作系统调用指定shell的执行脚本中的命令。

#!通常被称为“hash-bang”、“she-bang”或“sha-bang”。

于 2012-01-23T06:32:05.843 回答
20

操作系统采用默认 shell 来运行您的 shell 脚本。所以在脚本开头提到 shell 路径,你是在要求操作系统使用那个特定的 shell。它对于便携性也很有用。

于 2012-01-23T06:28:26.193 回答
19

shebang是指示加载程序使用在您尝试执行时指定的程序作为相关文件的#!解释器的程序。因此,如果您尝试运行顶部有的文件,实际运行的命令foo.sh是. 这是一种为不同程序使用不同解释器的灵活方式。这是在系统级别实现的,用户级别的 API 是 shebang 约定。#!/bin/bash/bin/bash foo.sh

还值得知道的是 shebang 是一个幻数- 一个人类可读的数字,它将文件标识为给定解释器的脚本。

即使没有shebang,您关于它“工作”的观点只是因为所讨论的程序是为与您使用的相同的shell编写的shell脚本。例如,您可以很好地编写一个 javascript 文件,然后放置一个#! /usr/bin/js(或类似的东西)来拥有一个 javascript“Shell 脚本”。

于 2012-01-23T06:36:50.357 回答
11

它被称为shebang。它由一个数字符号和一个感叹号字符 (#!) 组成,后跟解释器的完整路径,例如 /bin/bash。UNIX 和 Linux 下的所有脚本都使用第一行指定的解释器执行。

于 2012-01-23T06:36:27.773 回答
3

“Bourne-Again shell”的 Bash 标准只是 Linux 中众多可用 shell 的一种。

shell 是一个命令行解释器,它接受并运行命令。

Bash 通常是大多数 Linux 发行版中的默认 shell。这就是为什么 bash 是 shell 的同义词。

shell 脚本通常具有几乎相同的语法,但有时它们也不同。例如,数组索引在 Zsh 中从 1 开始,而不是在 bash 中从 0 开始。如果为 Zsh shell 编写的脚本有数组,它在 bash 中的工作方式将不一样。

为避免令人不快的意外,您应该告诉解释器您的 shell 脚本是为 bash shell 编写的。你是怎样做的?

只需将 bash 脚本开始到 #!/bin/bash

于 2021-04-17T14:53:53.980 回答
1

您还将在#!/bin/bash 之后看到一些其他参数,例如
#!/bin/bash -v -x
阅读此内容以获得更多想法。
https://unix.stackexchange.com/questions/124272/what-do-the-arguments-v-and-x-mean-to-bash

于 2019-04-04T01:08:19.297 回答
0

对于使用不同系统但没有该库现成可用的人来说,它可能很有用。如果没有声明,并且您的脚本中有一些该系统不支持的函数,您应该声明 #/bin/bash. 我以前在工作中遇到过这个问题,现在我只是把它作为一种练习。

于 2013-07-20T20:31:23.613 回答