Chinaunix首页 | 论坛 | 博客
  • 博客访问: 592901
  • 博文数量: 88
  • 博客积分: 4769
  • 博客等级: 中校
  • 技术积分: 989
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-24 02:31
文章分类

全部博文(88)

文章存档

2012年(4)

2011年(35)

2010年(49)

分类:

2010-08-18 16:19:14

Shell脚本通常一开始都是#! /bin/sh。
当Shell执行一个程序时,会要求UNIX内核启动一个新的进程(process),以便在该进
程里执行所指定的程序。内核知道如何为编译型程序做这件事。我们的nusers Shell脚
本并非编译型程序;当Shell要求内核执行它时,内核将无法做这件事,并回应“not
executable format file”(不是可执行的格式文件)错误信息。Shell收到此错误信息时,
就会说“啊哈,这不是编译型程序,那么一定时Shell脚本”,接着会启动一个新的/bin/sh
(标准Shell)副本来执行该程序。
当系统只有一个Shell时,“退回到/bin/sh”的机制非常方便。但现形的UNIX系统都会拥有
好几个Shell,因此需要通过一种方式,告知UNIX内核应该以哪个Shell来执行所指定的
Shell脚本。方法是,通过脚本文件中特殊的第一行来设置:在第一行的开头处使用#!这两
个字符。
当一个文件中开头的两个字符时#!时,内核会扫描该行其余的部分,看是否存在可用来执行
程序的解释器的完整路径。(中间如果出现任何空白符号都会略过)此外,内核还会扫描是否
有一个选项要传递给解释器。内核会以被指定的选项来引用解释器,再搭配命令行的其他部分。
举例来说,假设有一个csh脚本,名为/usr/ucb/whizprog,它的第一行如下所示:

    #!/bin/csh -f

再者,如果Shell的查找路径里有/usr/ucb,当用户键入whizproq -q /dev/tty01这条
命令,内核解释#!这行后,便会以如下的方式来引用csh:

    /bin/csh -f /usr/rcb/whizprog -q /dev/tty01

这样的机制让我们得以轻松地引用任何的解释器。例如我们可以这样引用独立的awk程序:

    #! /bin/awk -f

Shell脚本通常一开始都是#! /bin/sh。 下面是几个初级的陷阱(gotchas),请特别
留意:

×    当今的系统,对#!这一行的长度限制从63到1024个字符(character)都有。请
     尽量不要超过64个字符。
×    在某些系统上,命令行部分(也就是要传递给解释器执行的命令)包含了命令的完整
     路径名称。不过有些系统却不是这样;命令行的部分会原封不动地传递给程序。因此,
     脚本是否具有可移植性取决于是否有完整的路径名称。
×    别再选项(option)之后放置任何空白,因为空白也会跟着选项一起传递被引用的程
     序。
×    你需要知道解释器的完整路径名称。这可以用来规避可移植性问题,因为不同的厂商
     可能将同样的东西方在不同的地方。
×    一些较旧的系统上,内核不具备解释#!的能力,有些Shell会自行处理,这些Shell
     对于#1于紧随其后的解释器名称之间是否可以有空白,可能有不同的解释。


下面是修改过的nusers程序:

    $ cat nusers
    #! /bin/sh -
    
    who | wc -l
选项“-”表示没有Shell选项;这是基于安全上的考虑,可避免某种程度的欺骗式攻击。


阅读(1476) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-01-11 17:36:39

下面是修改过的nusers程序: $ cat nusers #! /bin/sh - who | wc -l 选项“-”表示没有Shell选项;这是基于安全上的考虑,可避免某种程度的欺骗式攻击。 在下不太明白不加-的话会有什么样的安全隐患,望兄台指教.