加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Bash 开头#!的含义

(2012-04-16 20:07:01)
标签:

杂谈

分类: linux

      在每个脚本的开头都使用"#!",这意味着告诉你的系统这个文件的执行需要指定一个解释器.#!实际上是一个2 字节[1]的魔法数字,这是指定一个文件类型的特殊标记, 换句话说, 在这种情况下,指的就是一个可执行的脚本(键入man magic 来获得关于这个迷人话题的更多详细信息).在#!之后接着是一个路径名.这个路径名指定了一个解释脚本中命令的程序,这个程序可以是shell,程序语言或者是任意一个通用程序.这个指定的程序从头开始解释并且执行脚本中的命令(从#!行下边的一行开始),忽略注释.

如:
1 #!/bin/sh
2 #!/bin/bash
3 #!/usr/bin/perl
4 #!/usr/bin/tcl
5 #!/bin/sed -f
6 #!/usr/awk -f

    上边每一个脚本头的行都指定了一个不同的命令解释器,如果是/bin/sh,那么就是默认shell(在Linux 系统中默认是Bash)。使用#!/bin/sh,在大多数商业发行的UNIX 上,默认是Bourne shell,这将让你的脚本可以正常的运行在非Linux 机器上,虽然这将会牺牲Bash 一些独特的特征. 脚本将与POSIX的sh 标准相一致.

注意: #! 后边给出的路径名必须是正确的,否则将会出现一个错误消息,通常是"Command not found",这将是你运行这个脚本时所得到的唯一结果.
当然"#!"也可以被忽略,不过这样你的脚本文件就只能是一些命令的集合,不能够使用shell 内建的指令了,如果不能使用变量的话,当然这也就失去了脚本编程的意义了.

那些具有UNIX 味道的脚本(基于4.2BSD)需要一个4 字节的魔法数字,在#!后边需要一个空格#! /bin/sh.
脚本中的#!行的最重要的任务就是命令解释器(sh 或者bash).因为这行是以#开始的,当命令解释器执行这个脚本的时候,会把它作为一个注释行.当然,在这之前,这行语句已经完成了它的任务,就是调用命令解释器.

如果在脚本的里边还有一个#!行,那么bash 将把它认为是一个一般的注释行.
1 #!/bin/bash
2
3 echo "Part 1 of script."
4 a=1
5
6 #!/bin/bash
7 # 这将不会开始一个新脚本.
8
9 echo "Part 2 of script."
10 echo $a # Value of $a stays at 1.

脚本执行的时候:

小心:使用sh scriptname 来调用脚本的时候将会关闭一些Bash 特定的扩展,脚本可能因此而调用失败.

为什么不直接使用scriptname 来调用脚本?如果你当前的目录下($PWD)正好有你想要执行的脚本,为什么它运行不了呢?失败的原因是,出于安全考虑,当前目录并没有被加在用户的$PATH 变量中.因此,在当前目录下调用脚本必须使用./scriptname 这种形式.

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有