lua的命令列引數放在乙個arg的table裡面。arg[0]存放指令碼檔案,arg[1…n]存放引數。
@(語法)
lua [options] [script [args]]注意:從原始碼上看最大引數個數不能超過8000,由巨集luai_maxcstack定義。
#define luai_maxcstack 8000@(arg.lua)
for i, v in pairs(arg) do
print(i, v)
end
執行結果:
[root@vm_89_131_centos lua]# lua arg.lua 1 2 3
1 12 2
3 3-1 lua
0 arg.lua
由上面運**況可知:
arg[-1]:lua執行檔案
arg[0]:執行指令碼
arg[1]:第乙個引數
arg[2]:第二個引數
arg[n]:第n個引數
下面的原始碼分析將用到上面的例子做講解,命令列的原始碼主要集中在兩個函式:
@(lua.c)
static
int getargs (lua_state *l,
char
**ar**,
int n)
return narg;
}
這個函式主要做如下:
static int handle_script (lua_state *l, char **ar**, int n)
這個函式3-4行的作用通俗講就是把新建的table命名為arg,實現的方式就是把這個新table放入全域性的_g表。這樣就可以直接在lua指令碼中使用arg陣列了。
@(偽**:)
_g["arg"] = newtable
@(arg1.lua)
print(...)
執行結果:
[root@vm_89_131_centos lua]# lua arg1.lua 1 2 3
1 2 3
可以看到直接輸出了指令碼執行引數。
原因:
乙個lua指令碼在實現的時候是當做乙個函式的,在指令碼內定義的函式可以理解成內嵌函式。可以想象成每個指令碼都有個main函式,main函式接受可變成引數。
function main(...)
-- script content
print(...)
end
getargs函式的8-9行所做的工作就是為這個函式設定引數。
在getargs函式中的引數int n是什麼意思?從**上看,這個引數n在整個引數解析的時候還挺重要的。
static int getargs (lua_state *l, char **ar**, int n)
總結:
命令列引數的**很短,但想看懂確不容易,主要是要弄懂lua堆疊的實現,這個會在後面詳細介紹。
Go 筆記二 命令原始碼檔案與命令列引數
典型回答 通過構建或安裝命令原始碼檔案生成的可執行檔案就可以被視為 命令 既然是命令,那麼就應該具備接收引數的能力。例如,要實現 根據執行程式時給定的引數問候某人 package main import flag 1 fmt var name string func init func main 解...
GOREPLAY原始碼解析之命令列引數
size medium b 環境與編譯 b size size medium b 命令列引數 b size goreplay支援很多種命令列引數。具體支援的命令列引數可以goreplay help來檢視,我們主要使用goreplay http,通常命令為 goreplay input raw 808...
LUA 命令列呼叫
在lua中呼叫命令列的方式主要有兩種os.execute io.popen os.execute可以執行dos命令,但是返回的是系統狀態碼,預設輸出.例如 os.execute mkdir dir 可在當前目錄建立乙個名為 dir 的資料夾io.popen 也可以執行dos命令,但是返回乙個檔案。l...