首先先明确两个不同类型的语言:编译型语言与解释型语言。编译型语言就是我们常见的高级编程语言(例如C/C++/Java等等),由编译型语言编写的程序文件需要先经过编译器编译链接为机器能识别的二进制机器文件,直接由机器识别执行,效率高。而解释型语言编写的程序文件称作解释器文件,不需要事先编译,而是由解释器识别执行,效率低,常见的解释型语言有shell、perl等。
当在linux系统的shell命令行上执行一个可执行文件时,系统会另起一个子进程,在子进程中内核会首先将该文件当做是二进制机器文件来执行,但是内核发现该文件不是机器文件后就会返回一个错误信息,收到错误信息后进程会将该文件看做是一个解释器文件,然后扫描该文件的第一行,获取解释器程序的名字,然后执行该解释器,并将该解释器文件当做解释器的一个参数,然后开始由解释器程序扫描整个解释器文件,执行每条语句,当然会跳过第一行语句。这就是一个解释器文件的的大概执行过程。
下面区分一下在shell命令行上,执行一个shell脚本的不同方式,假设脚本名字为test.sh,脚本位于当前目录:
(1)输入命令行:sh test.sh,这种方式是在shell中执行/bin/sh程序,然后将test.sh脚本文件作为其参数执行,/bin/sh程序会查找当前目录找到test.sh;
(2)输入命令行:./test.sh,这种方式就是上面所说的解释器文件的执行过程,shell首先会将test.sh文件当做二进制机器文件,之后会由解释器(根据第一行判断,例如可以是/bin/sh)解释执行。当然,这种方式要求test.sh必须是一个可执行文件,上述(1)可以不是。
(3)输入命令行:test.sh,这种方式和上述(2)类似,区别是(2)告诉shell在当前目录查找该文件,而该方式下,test.sh的路径必须在系统的环境变量中(即PATH变量),否则系统找不到该可执行程序文件,值得注意的是PATH变量是没有包含当前目录的。
自己总结的,欢迎朋友们交流或指正。