shell脚本:位于第一行的#!

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

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

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

也可以自己尝试将/bin/sh复制到其余地方 然后写一个脚本测试一下

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

 #! /bin/awk -f
 此处是awk程序

AWK命令详解
shell脚本通常一开始都是#! /bin/sh。如果你的/bin/sh并不符合POSIX标准,请将这个路径改为符合POSIX标准的shell,下面是几个初级的陷阱(gotchas):
1 当今的系统,对#!这一行的长度限制从63到1024个字符都有,请尽量不要超过64个字符。
2 在某些系统上,命令行部分(也就是要传递给解释器执行的命令)包含了命令的完整路径名称。不过有些不是这样,命令行的部分会原封不动的传递给程序,因此,脚本是否具有可移植性取决于是否有完整的路径名称。
3 别再选项(option)之后放置任何空白,因为空白也会跟着选项一起传递给被引用的程序
4 自己要知道解释器的完整路径名称。这可以用来规避可移植性问题。因为不同的厂商可能将同样的东西放在不同的地方(例如/bin/awk和/usr/bin/awk)
5 在一些较旧的系统上,内核不具有解释#!的能力,有些shell会自行处理,这些shell对于#!与紧随其后的解释器名称之间是否可以有空白,可能有不同的解释。
下面是修订过的nusers程序:

    $cat nusers
    #! /bin/sh -

   who | wc -l
选项-表示没有shell选项,这是基于安全考虑,可避免某种程度的欺骗式攻击(spoofing attack).
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值