关于shell脚本#!的说明

 我来答
大沈他次苹0B
2022-07-13 · TA获得超过7322个赞
知道大有可为答主
回答量:3059
采纳率:100%
帮助的人:177万
展开全部
Unix环境下的shell脚本通常都是#!/bin/sh开头,那么这句描述符究竟是什么含义呢,我试图解答这个问题。

首先#!必须出现在shell脚本的开头位置,后面跟一个shell解析器,比如/bin/sh,或者/bin/bash,或者/usr/bin/ksh, 等等.

我们看到 a.sh使用的可执行程序是/bin/bash,这个/bin/bash是在a.sh文件里面通过#!指定的。

a.out是一个可执行程序(ELF格式),它可以独自运行,但是不能通过一个shell来运行。

#!实际上就是文件的魔数(magic number)
我们知道ELF格式为文件头4个字符是".ELF",即(0x 7f 45 4c 46),而其实字符"#!"是shell脚本文件的魔数,即(0x 23 21),因为shell脚本是文本文件,#!就是两个可读的魔数字符。

这个魔数是干什么用的呢?它是被操作系统exec系列函数使用的,exec函数需要加载一个文件时,它会读取文件开头魔数域,如果是".ELF",那么就是一个ELF格式的可执行文件,如果是"#!"那么就是一个脚本文件,然后再从"#!"后面继续读取脚本解析器,最后调用脚本解析器可执行程序,并把脚本本身作为参数传递给他。

注意

当前shell会读取文件file的魔数

我也不清楚为什么sh file格式不能支持file是二进制可执行程序,理论上sh还是可以去分析file的魔数,从而判断file的类型,然后做区分处理。

https://en.wikipedia.org/wiki/Shebang_(Unix)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式