解析器文件--Interpreter File
来源:互联网 发布:mac显示硬盘隐藏文件 编辑:程序博客网 时间:2024/06/05 19:35
刚看了apue的关于解析器文件的部分,感受颇多,记录一下吧。
解析器文件是一种文本文件,文件的第一行的形式:#! pathname [optional-argument];
其中pathname指的时解析器名称,optional-argument是传递给解析器的参数。其实我们大家最熟悉的解析器文件就是shell脚本文件,shell脚本文件第一行都是#! /bin/sh。
解析器文件是一种文本文件,而解析器是可执行的二进制文件。解析器是由解析器文件的第一行指定的。
例如一个displayArgTab程序,用于显示执行该程序时的参数表,代码如下:
//name:displayArgTabint main(int argc, char *argv[]){ int i; for(i = 0; i<argc ;i++) printf("argv[%d]: %s\n", i, argv[i]); return 0;}以displayArgTab为解析器,写一个解析器文件,如下:
//解析器文件名为testInterpreter#! /tmp/displayArgTab arg生成的解析器文件testInterpreter也放在/tmp/下。下面通过execl来调用解析器文件:
if(execl("/tmp/testInterpreter", "testInterpreter", "myarg1", "myarg2", (char*)NULL) < 0) { printf("execl error...\n"); return 0; }执行结果为:
argv[0]: /tmp/displayArgTab
argv[1]: arg
argv[2]: /tmp/testInterpreter
argv[3]: myarg1
argv[4]: myarg2
由此可以得知内核在执行解析器文件时,向解析器传递的参数依次是:
- 解析器的pathname-路径名;
- 解析器的可选参数(如果没有则不会传递);
- exec的解析器文件的pathname-路径名;
- exec的第二个参数;
- exec的第三个参数,......;
有些程序是用脚本语言写的,解释器文件可将这一事实隐藏起来,例如shell脚本,awk脚本。例如下面是一段awk脚本,由awk程序进行解析。
#! /bin/awk -fBEGIN { for(i = 0; i < ARGC; i++) printf "ARGV[%d] = %s\n", i, ARGV[i] exit}上面#!后接的时该解析器文件的解析器awk程序,和解析器的参数-f;下面的脚本程序是按awk语法所写的脚本,功能是显示传递给awk脚本的参数。
测试结果如下:
//脚本文件名为testAwk$ ./testAwk arg1 arg2 arg3ARGV[0] = awkARGV[1] = arg1ARGV[2] = arg2ARGV[3] = arg3在运行文件testAwk时,要赋予x权限。上述执行解析器文件testAwk的过程实际是这样的:
- 首先shell读取这个命令时,首先会认为它是一个机器可执行的文件,即二进制的机器语言,shell会试图execl此文件名,但该文件时一个脚本文件,即文本文件,对于机器来说是不可执行的,所以会返回错误。
- 返回错误后,shell就认为该文件是一个解析器文件(脚本文件)。然后调用该解析器文件的解析器解析脚本文件的内容。
当然上述执行过程可以直接调用解析器文件的解析器来直接运行,如下:
$ awk -f testAwk arg1 arg2 arg3ARGV[0] = awkARGV[1] = arg1ARGV[2] = arg2ARGV[3] = arg3这样执行的效率肯定比直接执行脚本的效率要高,因为省略了上述第一个过程。
欢迎大家批评指正!
Sep 29, 2012 PM 20:28 @lab
- 解析器文件--Interpreter File
- 解释器文件(interpreter file)
- unix学习笔记---解释器文件(interpreter file)
- Interpreter解析器模式
- 解决文件提示: /bin/ksh^M: bad interpreter: bad interpreter:No such file or directory
- /bin/bash^M: 坏的解释器: 没有那个文件或目录(bad interpreter: No such file or directory)
- /bin/bash^M: 坏的解释器: 没那个文件或目录(bad interpreter: No such file or directory)
- 解释器文件(Interpreter Files)
- HtmlParser设计解析(1) - 解析器模式(Interpreter)
- /bin/sh^M: bad interpreter: No such file or directory(没有那个文件或目录)
- linux下执行Sh文件报告bin/sh^M: bad interpreter: No such file or directory
- shell文件执行出错/bin/bash^M: bad interpreter: No such file or directory
- linux下执行Sh文件报告bin/sh^M: bad interpreter: No such file or directory
- oracle 库文件解决办法 bad ELF interpreter: No such file or directory
- .sh文件中的首行 #!/bin/bash 以及 bad interpreter: Text file busy 文本文件忙错误
- 执行脚本文件出现bad interpreter:No such file or directory的原因
- 设计模式——解析器模式(Interpreter)
- 手记07之解释器文件(Interpreter Files)
- 设计模式——依赖倒转原则
- 正义是什么?
- java编程规范 + 十大低级错误
- 希尔排序(Shell Sort)
- SpringMVC—ParameterizableViewController控制器实现跳转页面
- 解析器文件--Interpreter File
- SpringMVC—UrlFilenameViewController控制器实现跳转页面
- 实验室框架个人总结过程
- SpringMVC—AbstractCommandController控制器
- 有关/mnt/asec /mnt/secure文件夹及app2sd原理
- JavaScript学习笔记(十) 函数声明VS函数表达式
- Nsight
- SpringMVC—数据绑定与属性编辑
- execlp( command, NULL );