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

我想打印出所有环境变量及其值的列表。我在 Stackoverflow 上查询了一些问题,以下几个问题非常接近但并未回答我的问题:

与 C 不同,Lua 没有将 envp** 参数传递给 main() 的方法,因此我无法找到获取所有环境变量列表的方法。 是否有人知道如何获取所有环境变量的名称和值列表?

原文链接 https://stackoverflow.com/questions/7633397

点赞
stackoverflow用户734069
stackoverflow用户734069

Standard Lua 函数

标准的 Lua 函数是基于 C 标准函数的,而且并不存在获取所有环境变量的 C 标准函数。因此,在 Lua 中也没有标准函数可以实现该功能。

您需要使用像 luaex 这样的模块来实现该功能。

2011-10-03 09:54:38
stackoverflow用户107090
stackoverflow用户107090

这段代码从一个旧的 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;
}
2011-10-04 13:30:05
stackoverflow用户531243
stackoverflow用户531243

你可以安装lua-posix模块。或者,RedHat安装有内置的POSIX例程,但是要启用它们,你需要做一个小技巧:

cd /usr/lib64/lua/5.1/
#(用你的版本替换5.1)
ln -s ../../librpmio.so.1 posix.so
#(根据需要替换“1”)
lua -lposix
> for i, s in pairs(posix.getenv()) do print(i,s,"\n") end

这个技巧在创建一个软链接到RPM的“io”目录并且将软链接命名为LUA将尝试打开的库的相同名称。如果你不这样做,你会得到:

./librpmio.so:undefined symbol:luaopen_librpmio

或类似的错误。

2013-08-13 16:13:43
stackoverflow用户4804353
stackoverflow用户4804353
本地环境变量 = {}

for line in io.popen("set"):lines() do
  envName = line:match("^[^=]+")
  本地环境变量[envName] = os.getenv(envName)
end

这个方法在一些情况下无法工作,例如 "运行您的应用程序的用户没有有效的 shell"。

2015-04-18 11:35:03
stackoverflow用户16179734
stackoverflow用户16179734

一个简单的 2 行代码:

    buf = io.popen("env", '*r')
    output = buf:read('*a')
    print(output) -- 或者做其他事情
2021-06-09 20:15:36