之前我已经制作了Bash脚本,并且在开始时它们都运行良好。 把它放进去有什么意义? 会有什么不同吗?
另外,你怎么发音#? 我知道!发音为"bang"。
#!如何发音?
-
除非你别无选择,否则你不需要也不应该这样做。 尽可能使用'#!/ bin / sh'并了解(POSIX)shell和bash之间的区别。 如果您发现自己处于具有不同shell的系统并且仍希望脚本能够正常运行,那么在您的简历增长太长时间之前会有一天。
-
它的发音为"Hash-Bang"或"She-Bang"。
-
我认为值得注意的是,只有将脚本作为可执行文件运行时才会执行此操作。 因此,如果设置可执行标志然后键入./yourscript.extension,例如./helloworld.py或./helloworld.sh,它将在该顶行查找解释器,该解释器将是#!/bin/python或!#/bin/bash,而在执行时 像python helloworld.py这样的脚本,第一行将不被观察,因为它被注释掉了。 所以它是shell /内核的特殊序列。
-
当使用!#for python和#时,@ JFA在bash和python之间的顺序发生了变化! 对于bash?
-
@AjeyaAnand没有它是一个错误,好抓
这是一个约定,所以* 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不是shell约定,在处理execve(2) syscall时由内核解释;所以shebang是一个内核约定,而不是shell。
-
此外,如果文件没有扩展名,它可以帮助像Vim这样的编辑者确定语法高亮的语言。如果没有shebang,Vim将显示与纯文本文件相同的bash脚本。
-
除非添加shebang,否则ps -u无法列出您的脚本文件名。为什么是这样?
-
这让我想知道你是否需要将#!/bin/sh添加到像.profile这样的东西和运行onload的东西
-
我在没有真正解释的情况下看到了很多问题的答案 - 但是你的答案的最后一部分"可执行文件可以是一个二进制程序,也可以是一百万个脚本类型和其他东西中的任何一个。因此需要#! /斌/庆典"。真的钉了它
-
那么...... hash-bang-slash-bin-slash-bash?
更确切地说,shebang #!,当它是可执行文件(x模式)文件的前两个字节时,由execve(2)系统调用(执行程序)解释。但execve的POSIX规范没有提到shebang。
它必须后跟解释器可执行文件的文件路径(BTW甚至可以是相对的,但通常是绝对的)。
在用户的$PATH中找到解释器(例如python)的一个好方法(或者可能不那么好)是使用env程序(总是在所有Linux上的/usr/bin/env),例如:
任何ELF可执行文件都可以是解释器。如果你愿意,你甚至可以使用#!/bin/cat或#!/bin/true! (但这通常是无用的)
-
有关#!/usr/bin/env hack的讨论,请参阅此问题。
-
如果我想将参数传递给python我该怎么做呢实际上我想执行#!/usr/bin/env bash -x。我怎么做 ?
-
它很简单我自己发现它,只需在#!/usr/bin/env bash -x后添加参数
-
bash几乎总是在/bin/bash所以你的shebang应该是#!/bin/bash -x
它被称为shebang。在unix中,#被称为sharp(如音乐)或hash(如twitter上的hashtags),以及!被称为爆炸。 (你实际上可以用!!引用你以前的shell命令,叫做bang-bang)。所以当放在一起时,你会得到haSH-BANG,或者shebang。
#之后的部分!告诉Unix用什么程序来运行它。如果未指定,它将尝试使用bash(或sh,或zsh,或任何你的$ SHELL变量),但如果它在那里它将使用该程序。另外,#是大多数语言的注释,因此在后续执行中会忽略该行。
-
如果我已经在bash中,它是否会启动另一个bash实例,如果它看到#!/ bin / bash?如果我已经在bash中并将其遗漏了怎么办?有什么区别吗?
-
@javascriptninja以任何一种方式启动一个新的bash shell。在bash的情况下,只要你已经使用bash,就没有任何区别。如果(a)你需要运行不仅仅是shell的东西,比如python或perl,或者(b)你不使用bash shell(即你使用zsh),那么shebang真的很重要但是你需要运行需要在bash中运行的东西。
-
但是,在我看来,包括shebang是一种很好的做法,只是因为读取代码的人知道发生了什么。
-
错误:execve(2)系统调用不使用$SHELL变量。它是解释shebang的核心。
-
@BasileStarynkevitch这是正确的,内核中的精灵加载器解释了shebang。我说如果没有提供shebang,将使用$ SHELL。
-
我很惊讶地发现省略#!甚至可以用于从find -exec运行的东西(即不直接来自shell)。例如在/tmp/foo(可执行文件)中使用echo hello,strace和ltrace -f find -exec /tmp/foo {} +表示execvp(3)成功:它首先尝试execve(2),当然以ENOEXEC (Exec format error)失败,但随后它回退到execve /bin/sh /tmp/foo。因此,由于libc的帮助,你声称"Unix将尝试$ SHELL"比我想象的更接近正确。大多数程序不直接使用execve,但没有 - #!会打破。
-
我赞成这一点,因为它很好地解释了为什么我可以在没有hashbang的情况下运行bash脚本。我跑了echo $SHELL,结果是/bin/bash。所以我之前不知道的事情。谢谢。
shebang是加载程序的一个指令,当你尝试执行它时,它会使用在#!之后指定的程序作为有问题文件的解释器。因此,如果您尝试运行名为foo.sh的文件,其顶部有#!/bin/bash,则运行的实际命令是/bin/bash foo.sh。这是为不同程序使用不同解释器的灵活方式。这是在系统级实现的,用户级API是shebang约定。
同样值得一提的是,shebang是一个神奇的数字 - 一个人类可读的数字,它将文件标识为给定解释器的脚本。
即使没有shebang,你关于它"工作"的观点仅仅是因为有问题的程序是为你正在使用的shell编写的shell脚本。例如,您可以很好地编写一个javascript文件,然后将#! /usr/bin/js(或类似的东西)放到一个javascript"Shell脚本"中。
操作系统使用默认shell来运行shell脚本。所以在脚本开头提到shell路径,你要求OS使用那个特定的shell。它对于便携性也很有用。
每个发行版都有一个默认shell。 Bash是大多数系统的默认设置。如果您碰巧在具有不同默认shell的系统上工作,那么如果脚本是针对Bash编写的,则脚本可能无法正常工作。
多年来,Bash从ksh和sh获取代码。
添加#!/bin/bash作为脚本的第一行,告诉操作系统调用指定的shell来执行脚本中的命令。
#!通常被称为"hash-bang","she-bang"或"sha-bang"。
它被称为shebang。它由一个数字符号和一个感叹号字符(#!)组成,后跟解释器的完整路径,如/ bin / bash。 UNIX和Linux下的所有脚本都使用第一行指定的解释器执行。
你还会在#!/ bin / bash之后看到一些其他参数,
例如
#!/bin/bash -v -x
阅读本文以获得更多想法。
https://unix.stackexchange.com/questions/124272/what-do-the-arguments-v-and-x-mean-to-bash。
对于使用不具有该库的不同系统的人来说,它可能是有用的。 如果未声明并且您的脚本中有一些该系统不支持的函数,则应声明#/ bin / bash。 我在工作之前遇到过这个问题,现在我只是把它作为一种练习。