函数 os.execute
用于运行系统命令,它等价于 C
语言中的函数 system
。该函数的参数为表示待执行命令的字符串,返回值为命令运行结束后的状态。其中,第一个返回值是一个布尔类型,当为 true
时表示程序成功运行完成;第二个返回值是一个字符串,当为 "exit"
时表示程序正常运行结束,当为 "signal"
时表示因信号而中断;第三个返回值是返回状态(若程序正常终结)或终结该程序的信号代码。
例如,在 POSIX
和 Windows
中都可以使用如下函数创建新目录:
function createDir(dirname) os.execute("mkdir" .. dirname) end
另一个非常有用的函数是 io.popen
。同函数 io.execute
一样,该函数运行一条系统命令,但该函数还可以重定向命令的输入输出,从而使得程序可以向命令中写入或从命令的输出中读取。例如,下列代码使用当前目录中的所有内容构建了一个表:
-- 对于POSIX系统而言,使用'ls'而非'dir' local f = io.popen("dir /B", "r") local dir = {} for entry in f:lines() do dir[#dir + 1] = entry end
其中,函数 io.popen
的第二个参数 "r"
表示从命令的执行结果中读取。由于该函数的默认行为就是这样,所以在上例中这个参数实际是可选的。
下面的示例用于发送一封邮件:
local subject = "some news" local address = "someone@somewhere.org" local cmd = string.format("mail -s '%s' '%s'", subject, address) local f = io.popen(cmd, "w") f:write([[ Nothing important to say. -- me ]]) f:close()
注意
该脚本只能在安装了相应工具包的 POSIX
系统中运行。上例中函数 io.popen
的第二个参数是 "w"
,表示向该命令中写入。
正如我们在上面的两个例子中看到的一样,函数 os.execute
和 io.popen
都是功能非常强大的函数,但他们也同样是非常依赖于操作系统的。
如果要使用操作系统的其他扩展功能,最好的选择是使用第三方库,比如用于基本目录操作和文件属性操作的 LuaFileSystem
,或者提供了 POSIX.1
标准支持的 luaposix
库。