首页 > 其他分享 >脚本首行中的#!是什么,有什么作用?

脚本首行中的#!是什么,有什么作用?

时间:2022-12-13 15:14:13浏览次数:37  
标签:脚本 bin 解释器 python 什么 首行 执行 bash

今天和小伙伴日常在群内吹水的时候,有群友问了这样一个问题:

脚本文件第一行加个 #!/usr/bin/bash 有什么用呢?

其实,除了这种之外,还有很多其他写法,比如:

#!/bin/bash
#!/usr/bin/env bash
#!/bin/awk

这些写法大同小异,但很多同学像我一样,在之前编写shell脚本的时候顺手就抄过来了,而没有去想过这一行语句到底是干什么的。

 

#!这个东西来自早期的Unix标准,叫做“she bang”或者“hash bang”,在#!之后的被认为是加载的解释器的路径,而这个标准也这样被沿袭到了现在。当执行shell脚本时,就会根据shebang中指定的路径去寻找对应的解释器,并将shell脚本交给解释器去执行。

看到#,可能很多人第一反应是这是一行注释,但是就算把它删掉,./xx.sh依然能正常执行,这更进一步的佐证了这一点。然而,这种想法其实是不正确的。如果你将第一行的路径随便设为一个不存在的路径,或者干脆删掉这一行,此时使用./方式执行的可执行文件就找不到对应的解释器,系统会转而找到另一个默认的解释器,而在一般来说的Linux系统中这个默认解释器为bash。所以对于shell脚本来说看似不需要这一行也能正常执行。

而至于env bash,在这个过程中其实是做了一次grep查找bash解释器的工作,env命令具体细节可自行查找,参考:https://blog.csdn.net/qq_37164975/article/details/106181500

 

 

但是,从这里就产生了一个问题,让我们解释一下文本文件和解释器之间的关系

如果你指定了某个解释器去执行这个文件时,首行是没有任何作用的。但是,在这种情况下,有一些花活可以玩。例如,你修改文件属性为可执行文件,使用./xx.sh的方式执行,就会先读第一行的shebang,将剩余的内容传递给shebang指定的解释器。

 

举个例子:怎么在Linux中运行python脚本?

常见的一种方法当然是python xx.py,但是,还有另一种方法。

首先将py脚本 chmod 添加可执行属性。

然后直接执行./xx.py,竟然成功运行。

打开该py文件,发现文件首行为#!/usr/bin/python或者类似写法。在Linux下,指定了/usr/bin/python作为python脚本的解释器。这种情况下,去掉后缀的.py依然能够成功执行。

在这个过程中,前一次是直接指定解释器为python,后一次则是通过shebang解析指定路径,相当于中间多中转了一次。

所以说,shell脚本、python脚本包括其他类型的脚本,在本质上都是文本文件,需要指定对应的解释器去帮助解释并执行。而./方式执行的脚本,未手动指定解释器,所以需要在首行#!指定解释器路径。

 

 

 

References:

https://blog.csdn.net/qq_37164975/article/details/106181500

https://m.php.cn/article/419430.html

https://blog.csdn.net/iot_flower/article/details/69055590

https://www.zhihu.com/question/333282017?sort=created&utm_id=0

标签:脚本,bin,解释器,python,什么,首行,执行,bash
From: https://www.cnblogs.com/kazusarua/p/16978841.html

相关文章

  • 油猴脚本-指定classname和id去除广告
    //==UserScript==//@name广告去除//@namespacehttp://tampermonkey.net///@version0.6//@description移除广告//@authorYou//@m......
  • 【脚本项目源码】Python实现鲁迅名言查询系统
    前言本文给大家分享的是如何通过利用Python实现鲁迅名言查询系统,废话不多直接开整~开发工具Python版本:3.6相关模块:PyQt5模块fuzzywuzzy模块环境搭建安装Python并......
  • 易班网薪油猴脚本 稳130+/天
    易班网薪油猴脚本稳130+/天收益构成:项目收益/天发帖100点赞30签到27天连续签到奖励50易伴云签到2评论-一、点赞先安装油猴插件,把......
  • React StrictMode 生命周期为什么会执行两次?
    什么是React.StrictMode?React.StrictMode是在2018年的16.3.0版本中引入的组件。一开始,它只用在类组件中,而在16.8.0中,它对hook同样适用。就像在版本说明中提及......
  • QT中LineEdit TextEdit PlainTextEdit 这三个控件有什么区别,分别用在什么情况下呢。
    QT中LineEdit、TextEdit、PlainTextEdit这三个控件区别为:输入内容不同、用途不同、限制行数不同。一、输入内容不同1、LineEdit:LineEdit的输入内容为单行文本输入。2、T......
  • MySQL 不同隔离级别,都使用了什么锁?
    大家好,我是树哥。在上篇文章,我们聊了「MySQL啥时候会用表锁,啥时候用行锁」这个问题。在文章中,我们还留了一个问题,即:如果查询或更新时的数据特别多,是否从行锁会升级为表锁?此......
  • Linux 系统日常巡检脚本
    https://www.pythondesign.cn/994.htmlLinux系统日常巡检脚本,巡检内容包含了,磁盘,内存cpu进程文件更改用户登录等一系列的操作直接用就行了报告以邮件发送到邮箱在......
  • 【Linux】PHP 执行 shell脚本
    需要去除禁用的函数 去php.ini 查询php是哪个用户执行的psaux|grepphp  需要配置执行php的用户权限vi/etc/sudoers##Allowroottorunanycommandsanywhereroo......
  • 启动appium服务的2种方法(python脚本&cmd窗口)
    启动appium服务的两种方法​​1.通过cmd窗口命令启动​​​​1.1启动单个appium服务​​​​1.2启动多个appium服务​​​​2.通过python脚本来启动​​​​2.1启动......
  • 为什么电脑的时间总是快2分钟
    由于工作需要,今天领到一台新的笔记本,轻轻地抚摸"新伙伴"的同时,发现笔记本的时间,快了2分钟,o((⊙﹏⊙))o表情~~明明已经联网了,为啥还是快两分钟呢?于是我就一顿操作猛如虎,结果一......