首页 > 系统相关 >Linux脚本首行中的#!是什么作用?为文件指定解释器

Linux脚本首行中的#!是什么作用?为文件指定解释器

时间:2024-03-25 10:56:11浏览次数:24  
标签:脚本 解释器 python 首行 指定 https Linux 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

 

2024-03-25 10:44:18【出处】:https://www.cnblogs.com/kazusarua/p/16978841.html

=======================================================================================

标签:脚本,解释器,python,首行,指定,https,Linux,bash
From: https://www.cnblogs.com/mq0036/p/18093917

相关文章

  • 查看linux系统参数命令
    在Linux系统中,可以使用 sysctl 命令来查看系统参数。要查看类似最大进程数的系统参数,可以使用以下命令: sysctl-a|grepmaxproc这条命令将列出所有与最大进程数相关的系统参数。其中,kernel.pid_max 是用来限制系统中最大进程ID数量的参数,kernel.threads-max 是用来限......
  • (小实验)理解编译原理:一个四则运算的解释器
    在前面的课程中,我在JavaScript和CSS的部分,多次提到了编译原理相关的知识。这一部分的知识,如果我们从编译原理“龙书”等正规的资料中学习,就会耗费掉不少的时间,所以我在这里设计了一个小实验,帮助你快速理解编译原理相关的知识。今天的内容比较特殊,我们来做一段详细的代码实验,......
  • 等保-linux-三权分立账号设置
    1.创建三权账号#新建系统管理员useraddsysadminpasswdsysadmin#新建安全管理员useraddsecadminpasswdsecadmin#新建审计管理员useraddauditadminpasswdauditadmin2.修改visudo配置visudo#系统管理员Cmnd_AliasSOFTWARE=/bin/rpm,/usr/bin/up2date,/usr/bin/yumCmn......
  • 在Linux中,如何检查和配置IP地址?
    在Linux中,检查和配置IP地址是常见的系统管理任务。以下是详细步骤和解释:1.检查IP地址使用ifconfig命令(在某些最新版本的Linux中,可能需要使用ipaddr或ipaddress代替):ifconfig或者ipaddrshow这些命令会显示所有网络接口的信息,包括IP地址、子网掩码和MAC地址等。通常,IP......
  • 在Linux中,如何分析网络连接和端口占用情况?
    在Linux中,分析网络连接和端口占用情况是非常重要的网络管理任务。以下是一些常用的方法和工具,帮助你详细分析网络连接和端口占用情况:1.分析网络连接1.使用netstat命令netstat是一个强大的网络统计工具,用于显示网络连接、路由表、接口统计等信息。sudonetstat-tuln选项说......
  • 在Linux中,如何查看Apache或Nginx服务的状态?
    在Linux中,查看Apache或Nginx服务的状态通常涉及到使用系统管理工具或特定于这些Web服务器的命令。以下是如何查看Apache和Nginx服务状态的详细步骤:1.查看Apache服务状态1.使用systemctl命令对于使用systemd的系统(如最新的Ubuntu、CentOS7及更高版本等),可以使用systemctl命令......
  • 在Linux中,如何启动、停止、重启一个系统服务?
    在Linux中启动、停止和重启系统服务的方法随着init系统的演进而有所不同,目前主流的init系统是Systemd。针对Systemd环境下的操作步骤如下:1.使用systemctl命令管理Systemd服务启动服务:systemctlstart<service_name>.service其中<service_name>是你要操作的服务名称,比......
  • 在Linux中,如何杀死一个进程?如果无法正常终止应如何操作?
    在Linux中,可以通过不同的命令来终止或杀死一个进程。以下是几种常见的方法:1.使用kill命令基本用法:首先,你需要找到要终止的进程的进程ID(PID)。这通常通过执行ps或pgrep命令完成:psaux|grep<process_name_or_part_of_command>或者更精确地查找PID:pgrep<process_n......
  • 什么是Linux?它与其他操作系统有何区别?
    什么是Linux?它与其他操作系统有何区别?什么是Linux?它与其他操作系统有何区别?摘要引言正文内容了解LinuxLinux与其他操作系统的区别开放性多样性安全性......
  • 安装Linux之前必备知识
    内容提要1、磁盘分区的相关概念2、使用静态分区的缺点3、LVM的相关概念磁盘分区在安装Linux以前,首先应该了解一些关于硬盘分区的知识。现代操作系统无一例外地使用了虚拟内存技术。Windows系统使用交换文件实现这一技术,而Linux系统使用交换分区实现。因此,安装Windows系统......