我以前制作过Bash脚本,而且它们#!/bin/bash
在开始时都运行良好。
放进去有什么意义?情况会有所不同吗?
还有,你怎么发音#
?我知道那!
发音为“bang”。
怎么#!
发音?
这是一个约定,所以 *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
.
更准确地说,当它是可执行文件(模式)文件的前两个字节时, shebang 由execve(2)系统调用(执行程序)解释。但是POSIX 规范并没有提到 shebang。#!
x
execve
它后面必须跟一个解释器可执行文件的文件路径(顺便说一句,它甚至可以是相对的,但大多数情况下是绝对的)。
在用户中找到解释器(例如)的一个好技巧(或者可能不是那么好)是使用程序(在所有 Linux 上总是),例如python
$PATH
env
/usr/bin/env
#!/usr/bin/env python
任何 ELF 可执行文件都可以是解释器。您甚至可以使用#!/bin/cat
,或者#!/bin/true
如果您愿意!(但这通常是无用的)
它被称为shebang。在 unix-speak 中,# 被称为尖锐(如在音乐中)或哈希(如 twitter 上的主题标签),并且!称为砰。(实际上,您可以使用 !! 引用您之前的 shell 命令,称为 bang-bang)。所以当放在一起时,你会得到haSH-BANG或shebang。
# 之后的部分!告诉 Unix 使用什么程序来运行它。如果未指定,它将尝试使用 bash(或 sh,或 zsh,或任何您的 $SHELL 变量),但如果它在那里,它将使用该程序。另外,# 是大多数语言中的注释,因此该行在后续执行中会被忽略。
每个发行版都有一个默认的 shell。Bash 是大多数系统的默认设置。如果您碰巧在具有不同默认 shell 的系统上工作,那么如果脚本是专门为 Bash 编写的,那么它们可能无法按预期工作。
多年来,Bash 从ksh
和sh
.
添加#!/bin/bash
为脚本的第一行,告诉操作系统调用指定shell
的执行脚本中的命令。
#!
通常被称为“hash-bang”、“she-bang”或“sha-bang”。
操作系统采用默认 shell 来运行您的 shell 脚本。所以在脚本开头提到 shell 路径,你是在要求操作系统使用那个特定的 shell。它对于便携性也很有用。
shebang是指示加载程序使用在您尝试执行时指定的程序作为相关文件的#!
解释器的程序。因此,如果您尝试运行顶部有的文件,实际运行的命令foo.sh
是. 这是一种为不同程序使用不同解释器的灵活方式。这是在系统级别实现的,用户级别的 API 是 shebang 约定。#!/bin/bash
/bin/bash foo.sh
还值得知道的是 shebang 是一个幻数- 一个人类可读的数字,它将文件标识为给定解释器的脚本。
即使没有shebang,您关于它“工作”的观点只是因为所讨论的程序是为与您使用的相同的shell编写的shell脚本。例如,您可以很好地编写一个 javascript 文件,然后放置一个#! /usr/bin/js
(或类似的东西)来拥有一个 javascript“Shell 脚本”。
它被称为shebang。它由一个数字符号和一个感叹号字符 (#!) 组成,后跟解释器的完整路径,例如 /bin/bash。UNIX 和 Linux 下的所有脚本都使用第一行指定的解释器执行。
“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
您还将在#!/bin/bash 之后看到一些其他参数,例如
#!/bin/bash -v -x
阅读此内容以获得更多想法。
https://unix.stackexchange.com/questions/124272/what-do-the-arguments-v-and-x-mean-to-bash。
对于使用不同系统但没有该库现成可用的人来说,它可能很有用。如果没有声明,并且您的脚本中有一些该系统不支持的函数,您应该声明 #/bin/bash. 我以前在工作中遇到过这个问题,现在我只是把它作为一种练习。