导言
本节将讲一讲shell的"#!行"的意义和具体作用,主要记录基础内容以及容易遗漏的要点。
1. #!的作用
#!的作用是:告知unix内核引用#!符号后所指定的解释器来解释执行该脚本程序。这样做的好处是让用户能够引用任何语言的解释器。
通常shell脚本首句会以#!/bin/bash开头。
-
#!/bin/bash #sample 1 默认
-
... "#!行"制定的解释器必须用绝对路径;
-
---------------------------------------
-
#! /bin/bash -x #sample 2 传递参数
-
... #shell按照/bin/bash -x 执行
2. 任意引用脚本解释器
不光是shell,我们还可以引用任何脚本解释器。
-
#!/bin/awk -f #sample 3 引用awk解释器
-
awk code here
-
---------------------------------------
-
#! /usr/bin/perl -w #sample 4 引用perl解释器
-
perl code here
3. ./script.sh和bash script执行的区别
区别:显示提供解释器执行脚本源程序,#!会被忽略。
以下是测试脚本,输出当前解释器的md5签名。
-
#! /bin/csh -x #csh执行
-
md5sum /proc/$$/exe #内置变量$$可以得到本进程id
-
-
---------------------------------------
-
#1dbb32aa0dd6b341155d05ea564c2c4a /bin/csh的md5
-
#a43f08494674e2da1a8e3547d0991e88 /bin/bash的md5
若./script执行,则脚本以/bin/csh -x interpreter.sh的形式被执行
-
$ ./interpreter.sh
-
md5sum /proc/32623/exe
-
1dbb32aa0dd6b341155d05ea564c2c4a /proc/32623/exe #csh的md5
若bash ./script执行,则脚本忽略开头的#!行,以/bin/bash interpreter.sh的形式执行
-
$ bash interpreter.sh
-
a43f08494674e2da1a8e3547d0991e88 /proc/30407/exe #bash的md5
4. #! 空选项防止攻击行为
"-"表示选项空,防攻击的具体原因待研究
-
#!/bin/bash - #空选项
-
shell code here
技巧汇总
-
内置变量$$可以得到所在进程的pid
-
#! - 可以防止某些脚本攻击行为
参考资料
shell脚本学习指南 O'reilly Preface and Chapter 2
阅读(1095) | 评论(0) | 转发(0) |