Chinaunix首页 | 论坛 | 博客
  • 博客访问: 135849
  • 博文数量: 28
  • 博客积分: 527
  • 博客等级: 中士
  • 技术积分: 367
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-09 17:05
个人简介

运维开发工程师。致力于网络,WEB应用服务,Linux系统运维。方向:操作系统,监控,自动化

文章分类

全部博文(28)

文章存档

2013年(12)

2012年(16)

分类: LINUX

2012-12-05 22:10:48

导言
本节将讲一讲shell的"#!行"的意义和具体作用,主要记录基础内容以及容易遗漏的要点。

1. #!的作用
#!的作用是:告知unix内核引用#!符号后所指定的解释器来解释执行该脚本程序。这样做的好处是让用户能够引用任何语言的解释器。
通常shell脚本首句会以#!/bin/bash开头。
  1. #!/bin/bash      #sample 1 默认
  2. ... "#!行"制定的解释器必须用绝对路径;
  3. ---------------------------------------
  4. #! /bin/bash -x #sample 2 传递参数
  5. ... #shell按照/bin/bash -x 执行

2. 任意引用脚本解释器
不光是shell,我们还可以引用任何脚本解释器。
  1. #!/bin/awk -f      #sample 3 引用awk解释器
  2. awk code here
  3. ---------------------------------------
  4. #! /usr/bin/perl -w  #sample 4 引用perl解释器
  5. perl code here

3. ./script.sh和bash script执行的区别
区别:显示提供解释器执行脚本源程序,#!会被忽略。
以下是测试脚本,输出当前解释器的md5签名。
  1. #! /bin/csh -x #csh执行
  2. md5sum /proc/$$/exe #内置变量$$可以得到本进程id

  3. ---------------------------------------
  4. #1dbb32aa0dd6b341155d05ea564c2c4a  /bin/csh的md5
  5. #a43f08494674e2da1a8e3547d0991e88  /bin/bash的md5
若./script执行,则脚本以/bin/csh -x interpreter.sh的形式被执行
  1. $ ./interpreter.sh
  2. md5sum /proc/32623/exe
  3. 1dbb32aa0dd6b341155d05ea564c2c4a /proc/32623/exe #csh的md5
若bash ./script执行,则脚本忽略开头的#!行,以/bin/bash interpreter.sh的形式执行
  1. $ bash interpreter.sh
  2. a43f08494674e2da1a8e3547d0991e88 /proc/30407/exe #bash的md5

4. #! 空选项防止攻击行为
"-"表示选项空,防攻击的具体原因待研究
  1. #!/bin/bash - #空选项
  2. shell code here

技巧汇总
  1. 内置变量$$可以得到所在进程的pid
  2. #! - 可以防止某些脚本攻击行为

参考资料
shell脚本学习指南 O'reilly Preface and Chapter 2
阅读(1104) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~