Lua原始碼筆記 命令列引數

2021-09-21 17:57:24 字數 1900 閱讀 9855

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...