【问题标题】:Print list of ALL environment variables打印所有环境变量的列表
【发布时间】:2011-10-03 09:50:15
【问题描述】:

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

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

【问题讨论】:

    标签: lua


    【解决方案1】:

    标准 Lua 函数基于 C 标准函数,没有 C 标准函数可以获取所有环境变量。因此,也没有 Lua 标准函数可以做到这一点。

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

    【讨论】:

    • @AlexStack:不完全是。 argv 指的是传递给程序的命令行参数。 envp 指的是环境变量,但它是非标准的。
    【解决方案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;
    }
    

    【讨论】:

    • 嗯,这是使用 C 解决问题的一种方法。显然没有纯 Lua 函数可以做到这一点。还是谢谢。
    • @AlexStack,正如 Nicol 所说,没有纯 Lua 函数,因为 environ 不是 ANSI C,只是 POSIX。
    【解决方案3】:

    您可以安装 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
    

    或类似的。

    【讨论】:

      【解决方案4】:
      local osEnv = {}
      
      for line in io.popen("set"):lines() do 
        envName = line:match("^[^=]+")
        osEnv[envName] = os.getenv(envName)
      end
      

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

      【讨论】:

      • 如果某些环境变量名称或值包含换行符或其他有趣的字符,也可能会失败。
      【解决方案5】:

      一个简单的 2 班轮:

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

      【讨论】:

        猜你喜欢
        • 2021-02-16
        • 1970-01-01
        • 2019-10-31
        • 2019-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-29
        • 1970-01-01
        相关资源
        最近更新 更多