Распечатать список ВСЕХ переменных среды - PullRequest
7 голосов
/ 03 октября 2011

Я хотел бы напечатать список всех переменных среды и их значений. Я искал Stackoverflow, и следующие вопросы подошли близко, но не отвечали мне:

В отличие от C, Lua не имеет параметра envp**, который передается в main(), поэтому я не смог найти способ получить список всех переменных среды. Кто-нибудь знает, как я могу получить список имен и значений всех переменных среды ?

Ответы [ 4 ]

5 голосов
/ 03 октября 2011

Стандартные функции Lua основаны на C-стандартных функциях, и нет C-стандартной функции для получения всех переменных среды.Поэтому для этого также не существует стандартной функции Lua.

Вам придется использовать такой модуль, как luaex , который предоставляет эту функцию.

2 голосов
/ 04 октября 2011

Этот код был извлечен из старой привязки 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;
}
1 голос
/ 13 августа 2013

Вы можете установить модуль 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

или аналогичный.

0 голосов
/ 18 апреля 2015
local osEnv = {}

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

в некоторых случаях это не будет работать, например, "нет допустимой оболочки для пользователя, запускающего ваше приложение"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...