仔細觀察上面的三個例子,答案開始浮出水面了。正如在開始時講到的,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的腳本文件嗎?我們來試試,下面是一個例子:
代碼: