解析器文件(Interpreter Files)

解析器文件(Interpreter Files)

现在所有的UNIX系统都支持解析器文件。它是在文本文件最开始的一行,其格式如下:

#! pathname [optional-argument]

在叹号和pathname中间的空格是可选 的。经常能看到的形式如下:

#!/bin/sh

pathname是绝对路径,也就是说没使用PATH。识别这些文件是在内核中完成的,做为exec系统调用的一部分。实际文件是由内核执行的,而不是解析器文件,但解析器文件路径在文件的第一行指定。

注:如果pathname的程序中有exec函数,那么exec函数的参数会向右移动,移动的位数要看解析器文件那行,有几个参数。

解析器文件为用户提高了效率,但付出了一些内核时间为代价(因为是在内核中识别这些文件)。解析器文件用于下面的原因:

  1. 在脚本中隐藏了某些其它程序语言。例如:
    awkexample optional-arguments
    代替了实际使用的是awk脚本
    awk -f awkexample optional-arguments
  2. 提高了脚本效率。考虑下面的例子,我们仍然隐藏该程序做为awk脚本,封装到一个shell脚本中:
    awk 'BEGIN{
        for ( i = 0; i< ARGC; i++)
            printf "ARGV[%d] = %s\n",  i, ARGV[i]
        exit
    }' $*

    这个程序的问题是引发更多的调用请求。首先,读命令并且尝试有execlp打开文件名。因为shell脚本是可执行文件,但并不是可执行的机器代码,会返回一个错误,并且execlp会假定这个文件是一个shell脚本。然后用/bin/sh执行该脚本。shell可以正确执行该脚本,但是需要运行awk程序,shell会执行一个fork, execwait。因此使用shell脚本替换解析器脚本会产生更多的代价。

  3. 解析器脚本让我们可以使用除了/bin/sh之外其它程序编写shell脚本。
    #!/bin/csh
    (这是C shell 脚本)
Comments are closed.