导言

本节将讲一讲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