解释器是什么?
是执行解释型语言的程序。
很多语言都是解释型语言,比如JavaPython,因此解释器也有很多种。
执行shell语言的解释器:
/bin/bash
/bin/sh
 
解释器文件是什么?
可以被解释器执行的文件,比如shell脚本。
这是一个非常简单的shell解释器文件(俗称shell脚本):
#!/bin/bash
 
echo "Shell start."
执行它:
[maria@localhost primer-unix]$ ./shell.sh
Shell start.
 
再来一个普通的编译型文件(俗称.c文件)
#include <stdio.h>
 
int main(int argc, char *argv[])
{
        printf("Test start.\n");
        return 0;
}
编译并执行它:
[maria@localhost primer-unix]$ gcc test.c -o test
[maria@localhost primer-unix]$ ./test
Test start.
 
那它们有什么区别呢?
当执行解释器文件的时候,并不是执行这个文件本身,而是执行/bin/bash
当执行编译型文件的时候,就是执行文件本身。
 
内核调用exec处理的方式也是由区别的,下面两个exec调用的打印结果也是一样的:
execlp("./test", "", (char *)0);
execlp("./shell.sh", "", (char *)0);
NOTE:执行execlp完毕后会跳出执行它的进程,所以这两个函数需要放置在不同的子进程中,或者写成:
if ((pid = fork()) < 0)
        perror("Cannot fork child 1.");
else if (pid == 0)
        execlp("./test", "", (char *)0);
 
if ((pid = fork()) < 0)
        perror("Cannot fork child 2.");
else if (pid == 0)
        execlp("./shell.sh", "", (char *)0);
 
解释器文件不一定是调用bash,也可以使用任意程序,比如:
#!/home/maria/maria_work/workon_fedora/programs/primer-unix/test 1 2 3
 
echo "Shell start."
如果test里面加入了打印参数列表的功能,那么它的输出结果会是这样:
[maria@localhost primer-unix]$ ./shell.sh a b c
Test start.
argv[0] = /home/maria/maria_work/workon_fedora/programs/primer-unix/test
argv[1] = 1 2 3
argv[2] = ./shell.sh
argv[3] = a
argv[4] = b
argv[5] = c
 
解释器文件的使用方法,比如它的参数列表排列、被exec调用时的特点等等,非常有意思。
It's very interesting!