美文网首页Shell语言用例
关于shell脚本#!的说明

关于shell脚本#!的说明

作者: CodingCode | 来源:发表于2018-01-21 13:46 被阅读13次

Unix环境下的shell脚本通常都是#!/bin/sh开头,那么这句描述符究竟是什么含义呢,我试图解答这个问题。

#!出现的位置

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

看一个例子

$ cat a.sh
#!/bin/bash
readlink /proc/$$/exe
$ ./a.sh
/bin/bash

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

再看另一个例子a.out

$ cat a.c
#include <stdio.h>

int main()
{
    printf("Hello a.out!\n");
    return 0;
}
$ gcc t.c
$ ./a.out
Hello a.out!
$ bash ./a.out
./a.out: ./a.out: cannot execute binary file

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

分析

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

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

注意

  1. 如果shell脚本的命令行中已经有脚本解析器了,那么脚本中的"#!"内容将被丢弃,而采用命令行中的解析器。
    例如
$ /bin/tcsh a.sh
/bin/tcsh
$ /usr/local/bin/pdksh a.sh
/usr/local/bin/pdksh
$ /bin/ksh a.sh
/bin/readlink
  1. 如果shell脚本中没有魔数"#!"怎么办
    shell使用当前的shell来处理。
$ cat a.sh
readlink /proc/$$/exe
$ ./a.sh
/bin/bash
$ echo $SHELL
/bin/bash
  1. 对于一般文件的加载过程
$ ./file格式

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

  • 如果是".ELF",二进制可执行程序,安装ELF文件处理
    • 区分.o, .so, etc.
  • 如果是"#!",那么加载魔数后面指定的可执行程序,并把file作为参数传递过去。
  • 其它:file会作为一个当前shell类型的脚本运行,即试图把path_to_file的内容按照脚本来解释执行。
  1. sh file格式
    注意这种格式要求file必须是一个shell脚本,不能是二进制可执行程序。
    如果file是一个二进制格式文件,则可以采用格式:sh -c file
    对于后一种格式,其实不管file是一个脚本还是一个二进制可执行程序,都可以运行。

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

Refer to:

https://en.wikipedia.org/wiki/Shebang_(Unix)

相关文章

  • 关于shell脚本#!的说明

    Unix环境下的shell脚本通常都是#!/bin/sh开头,那么这句描述符究竟是什么含义呢,我试图解答这个问题。...

  • shell脚本编写

    shell脚本格式 文件首行指定执行shell的程序以及相关说明 shell 脚本文件后缀,建议命名为.sh 脚本...

  • shell脚本函数

    shell 可以用户定义函数,然后在shell脚本中可以随便调用。 shell中函数的定义格式如下: 说明: 1、...

  • Shell 脚本中的小技巧

    Shell 脚本中的小技巧 关于变量 一,在shell 脚本中定义默认值 [图片上传失败...(image-54c...

  • 7分钟Linux Shell编程:2 变量

    1 第一个shell脚本说明 观察我们第一shell脚本,有一些疑问,my_name是什么?echo是什么? 2 ...

  • 1,$......含义

    简要说明 $$shell本身的PID(ProcessID,即脚本运行的进程ID号)$!shell最后运行的后台Pr...

  • 编写shell脚本运行python文件

    说明:第一次使用mac编写shell脚本,查看了很多网上资料大多是,直接使用编写脚本程序运行,而我想使用shell...

  • 嵌入式day12

    shell脚本的本质 shell脚本语言是解释型语言 shell脚本的本质:shell命令的有序集合 shell编...

  • Shell入门笔记

    Shell脚本:Linux Shell脚本学习指南菜鸟教程 - Shell教程Linux入门 - Shell脚本是...

  • Shell script + crontab实现Mysql定时备

    一、Shell 脚本 Shell 脚本(shell script),是一种为 shell 编写的脚本程序。 业界所...

网友评论

    本文标题:关于shell脚本#!的说明

    本文链接:https://www.haomeiwen.com/subject/hubfaxtx.html