博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bash的shebang行
阅读量:6939 次
发布时间:2019-06-27

本文共 1429 字,大约阅读时间需要 4 分钟。

  

1.名称含义

在Unix中,shebang其实就是指“#!”,它取自#(SHArp)和!(bang)。

 

2.作用

它是很多脚本文件中第一行的前两个字符,用来告诉Unix系统要用shebang后面指定的解释器来解释该脚本。所以,在很多脚本中,第一行往往都是这么写的:
#! /abs/path/to/interpreter

 

3.来源

根据wikipedia上的解释,shebang最初由Dennis Ritchie引入的,时间大概是在Version 7和Version 8之间。也正是因为shebang是以#开头,所以很多Unix上的脚本都是用#作为注释的开始。常见的有:
#!/bin/sh
#!/usr/bin/perl -w
#!/bin/awk -f
#!/usr/bin/env python
#!/usr/bin/ruby

 

4.shebang的路径

shebang没有你想象得这么简单。首先,它后面的解释器路径一般来说必须是绝对路径。(当然了,有人也说像#!python这样的也能执行。)如果不是,可能就会出现类似的错误:
bash: ./foo.py: python: bad interpreter: No such file or directory
因为shell会直接用execve去执行这个文件,出错马上就退出。而execve会通过shebang辨认出这个一个脚本文件,然后尝试用后面的解释器去执行,但它并没有在PATH中寻找解释器,而是完全依靠你给出的路径。如果你不想指定绝对路径或者出于可移植的原因不好指定,那么你应该试试用env(1),就上面的python的shebang一样,它会帮你在PATH中搜索。python之所以更倾向于这个还有个原因,就是env一般固定在/usr/bin目录下,而python的安装位置就相对不那么固定。用env时你应该注意这么一个事实:传递给解释器的argv和你想象得并不一样。下面这个就是不对的:
#!/usr/bin/env perl -w
shell会提示:/usr/bin/env: perl -w: No such file or directory
错误的根源就是perl -w被当成了整体传递给env。
用下面的程序来看一下参数传递过程:
/*test.c*/
#include 
int main(int argc, char** argv) {
int i;
for (i=0; i<ARGC; i++)
fprintf(stdout, “argv[%d]: \”%s\”\n”, i, argv[i]);
return 0;
}
然后把编译出的test当作解释器:
$ cat invoker.sh
#!/home/wangcong/test -1 -2 -3
结果如下:
$ ./invoker.sh a b c
argv[0]: “/home/wangcong/test”
argv[1]: “-1 -2 -3″
argv[2]: “./invoker.sh”
argv[3]: “a”
argv[4]: “b”
argv[5]: “c”
当然了,并不是所有的Unix都是这样,但最起码Linux上的bash和zsh上就是如此。所以,要编写可移植的脚本,你应该当心这一点!

转载于:https://www.cnblogs.com/zhaolizhe/p/6924113.html

你可能感兴趣的文章
剑指offer第一天
查看>>
IIS站点下多应用程序 C#获取根目录方法
查看>>
devstack重启后不能运行
查看>>
ubuntu14.04 us sources.list
查看>>
SVN使用教程总结
查看>>
解决:父级元素不能被子元素内容撑开的解决办法,父级元素没有高度的解决办法...
查看>>
安装原版Win8.1并激活
查看>>
黑色星期五,linode新注册送$25
查看>>
BeautifulSoup_lxml解析
查看>>
封装、继承、多态
查看>>
“玲珑杯”ACM比赛 Round #19 B -- Buildings (RMQ + 二分)
查看>>
valueOf跟toString区别
查看>>
${base}
查看>>
浅谈CSRF攻击方式
查看>>
Excel 2010 如何快速统计一列中相同数值出现的个数 很不错
查看>>
python的部分内置函数
查看>>
[leetcode-791-Custom Sort String]
查看>>
PHP WebService/Soap接口生成方法。
查看>>
细说Html中,ID、Name、class三者的区别
查看>>
[Visual Studio Code] 执行python
查看>>