仔细观察上面的三个例子,答案开始浮出水面了。正如在开始时讲到的,exec族函数的处理是把#!后面的字符串为命令,后面加上execl参数列表中指定的参数列表,这样形成了新的程序执行。分析一下mytest.c源程序,execl把命令的结果是这样执行的/home/kiron/testexec的内容是#!/home/kiron/showargs addargs,则#!后面的字符串"/home/kiron/showargs addargs"加上命令参数列表:"/home/kiron/testexec arg1 arg2"就形成了新的程序行:/home/kiron/showargs addargs /home/kiron/testexec arg1 arg2。对于testexec脚本,我们在shell中调用它时,shell调用了fork,exec,wait来执行它,也就是和程序 mytest.c一样用了exec函数,首先,exec函数对#!行分析后得出此脚本的解释器为/home/kiron/showargs,然后就形成了把命令行处理成了:“/home/kiron/showargs addargs ./testexec”。
注意:#!行中的解释器的路径必须是全路径,exec函数并不对其特殊处理,比如用PATH变量来搜索它的真实路径,所以路径是由程序员来保证正确的。
二、我的脚本第一句必须得是#!/bin/bash吗?
当然不必了,通过上面的解释,其实第一句的#!是对脚本的解释器程序路径,脚本的内容是由解释器解释的,我们可以用各种各样的解释器来写对应的脚本,比如说/bin/csh脚本,/bin/perl脚本,/bin/awk脚本,/bin/sed脚本,甚至/bin/echo等等。那我们真的能写一个 /bin/echo的脚本文件吗?我们来试试,下面是一个例子: