关于shell脚本#!的说明
展开全部
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)
首先#!必须出现在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)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询