打印所有环境变量的列表

时间:2011-10-03 09:50:16

标签: lua

我想打印所有environment variables及其值的列表。我搜索了Stackoverflow,接下来的问题很接近,但没有回答我:

与C不同,Lua没有传递给envp**的{​​{1}}参数,所以我找不到获取所有环境变量列表的方法。有谁知道如何获得所有环境变量的名称和价值列表

5 个答案:

答案 0 :(得分:5)

标准Lua函数基于C标准函数,并且没有C标准函数来获取所有环境变量。因此,也没有Lua标准功能。

您必须使用luaex这样的模块,它提供此功能。

答案 1 :(得分:2)

此代码是从旧的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;
}

答案 2 :(得分:1)

您可以安装lua-posix模块。或者,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

或类似。

答案 3 :(得分:0)

local osEnv = {}

for line in io.popen("set"):lines() do 
  envName = line:match("^[^=]+")
  osEnv[envName] = os.getenv(envName)
end

这在某些情况下不起作用,例如"运行你的应用的用户没有有效的shell"

答案 4 :(得分:0)

简单的 2 衬里:

    buf = io.popen("env", '*r')
    output = buf:read('*a')
    print(output) -- or do whatever