Lua 打印所有环境变量的列表

Lua 打印所有环境变量的列表,lua,Lua,我想打印一份所有文件及其值的列表。我搜索了Stackoverflow,以下问题很接近,但没有回答我: (这是关于Lua环境而不是系统环境变量的) (同样是关于_G而不是os环境变量) (这是一个很好的函数,但我必须知道环境变量的名称才能调用它) 与C不同,Lua没有传递给main()的envp**参数,因此我无法找到一种方法来获取所有环境变量的列表。有人知道如何获取所有环境变量的名称和值的列表吗?标准Lua函数基于C标准函数,没有C标准函数来获取所有环境变量。因此,也没有一个Lua标准函数来

我想打印一份所有文件及其值的列表。我搜索了Stackoverflow,以下问题很接近,但没有回答我:

  • (这是关于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
引用环境变量,但它是非标准的。如果某些环境变量名称或值包含换行符或其他有趣的字符,它也可能失败。