linux执行bin文件的脚本,linux - 为什么需要在脚本文件的开头加上#!/ bin / bash?...

linux - 为什么需要在脚本文件的开头加上#!/ bin / bash?

之前我已经制作了Bash脚本,并且在开始时它们都运行正常。 把它放进去有什么意义? 会有什么不同吗?

另外,#!如何发音? 我知道!的发音为“bang”。

#!是怎么发音的?

8个解决方案

354 votes

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

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

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

PS:感叹号(#!/bin/bash)被亲切地称为“爆炸”。 shell注释符号(#)有时称为“哈希”。

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

paulsm4 answered 2019-01-05T08:59:46Z

118 votes

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

它必须后跟解释器可执行文件的文件路径(BTW甚至可以是相对的,但通常是绝对的)。

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

#!/usr/bin/env python

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

Basile Starynkevitch answered 2019-01-05T09:00:31Z

45 votes

它被称为shebang。 在unix-speak中,#被称为sharp(如音乐)或hash(如twitter上的hashtags),以及! 被称为爆炸。 (你实际上可以用!!引用你以前的shell命令,叫做bang-bang)。 所以当放在一起时,你会得到haSH-BANG,或者shebang。

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

austin1howard answered 2019-01-05T09:01:03Z

16 votes

shebang是加载程序使用程序的指令,当您尝试执行该程序时,该程序在#! /usr/bin/js之后指定为该文件的解释器。 因此,如果您尝试运行名为foo.sh的文件,其顶部有#!/bin/bash,则运行的实际命令是/bin/bash foo.sh.这是为不同程序使用不同解释器的灵活方式。 这是在系统级实现的,用户级API是shebang约定。

同样值得一提的是,shebang是一个神奇的数字 - 一个人类可读的数字,它将文件标识为给定解释器的脚本。

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

Noufal Ibrahim answered 2019-01-05T09:01:41Z

15 votes

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

Balaswamy Vaddeman answered 2019-01-05T09:02:05Z

13 votes

每个发行版都有一个默认shell。 Bash是大多数系统的默认设置。 如果您碰巧在具有不同默认shell的系统上工作,那么如果脚本是针对Bash编写的,则脚本可能无法正常工作。

多年来,Bash的代码来自#!和shell。

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

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

jaypal singh answered 2019-01-05T09:02:48Z

9 votes

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

Uday Sawant answered 2019-01-05T09:03:11Z

0 votes

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

Beardy answered 2019-01-05T09:03:35Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值