Lua 打印所有环境变量的列表
我想打印一份所有文件及其值的列表。我搜索了Stackoverflow,以下问题很接近,但没有回答我:Lua 打印所有环境变量的列表,lua,Lua,我想打印一份所有文件及其值的列表。我搜索了Stackoverflow,以下问题很接近,但没有回答我: (这是关于Lua环境而不是系统环境变量的) (同样是关于_G而不是os环境变量) (这是一个很好的函数,但我必须知道环境变量的名称才能调用它) 与C不同,Lua没有传递给main()的envp**参数,因此我无法找到一种方法来获取所有环境变量的列表。有人知道如何获取所有环境变量的名称和值的列表吗?标准Lua函数基于C标准函数,没有C标准函数来获取所有环境变量。因此,也没有一个Lua标准函数来
- (这是关于Lua环境而不是系统环境变量的)
- (同样是关于_G而不是os环境变量)
- (这是一个很好的函数,但我必须知道环境变量的名称才能调用它)
与C不同,Lua没有传递给
main()
的envp**
参数,因此我无法找到一种方法来获取所有环境变量的列表。有人知道如何获取所有环境变量的名称和值的列表吗?标准Lua函数基于C标准函数,没有C标准函数来获取所有环境变量。因此,也没有一个Lua标准函数来实现这一点
您必须使用一个模块,如,提供此功能。此代码是从旧的POSIX绑定中提取的
static int Pgetenv(lua_State *L) /** getenv([name]) */
{
if (lua_isnone(L, 1))
{
extern char **environ;
char **e;
if (*environ==NULL) lua_pushnil(L); else lua_newtable(L);
for (e=environ; *e!=NULL; e++)
{
char *s=*e;
char *eq=strchr(s, '=');
if (eq==NULL) /* will this ever happen? */
{
lua_pushstring(L,s);
lua_pushboolean(L,0);
}
else
{
lua_pushlstring(L,s,eq-s);
lua_pushstring(L,eq+1);
}
lua_settable(L,-3);
}
}
else
lua_pushstring(L, getenv(luaL_checkstring(L, 1)));
return 1;
}
您可以安装luaposix模块。或者,RedHat安装有内置的POSIX例程,但要启用它们,您必须采取以下措施:
cd /usr/lib64/lua/5.1/
# (replace 5.1 with your version)
ln -s ../../librpmio.so.1 posix.so
# (replace the "1" as needed)
lua -lposix
> for i, s in pairs(posix.getenv()) do print(i,s,"\n") end
诀窍在于创建指向RPM“io”目录的软链接,并将软链接命名为LUA将尝试打开的库的相同名称。如果不这样做,您会得到:
./librpmio.so: undefined symbol: luaopen_librpmio
或类似的
local osEnv = {}
for line in io.popen("set"):lines() do
envName = line:match("^[^=]+")
osEnv[envName] = os.getenv(envName)
end
这在某些情况下不起作用,例如“运行应用程序的用户没有有效的shell”简单的2行程序:
buf = io.popen("env", '*r')
output = buf:read('*a')
print(output) -- or do whatever
这是用C来解决这个问题的一种方法。显然,没有纯Lua函数可以做到这一点。无论如何,谢谢。@AlexStack,正如Nicol所提到的,没有纯Lua函数,因为
environ
不是ANSI C,只是POSIX。@AlexStack:不完全是argv
指传递给程序的命令行参数envp
引用环境变量,但它是非标准的。如果某些环境变量名称或值包含换行符或其他有趣的字符,它也可能失败。