2011-10-03 14 views
7

Me gustaría imprimir una lista de todos environment variables y sus valores. He buscado en la Stackoverflow y las siguientes preguntas vienen cerca pero no me responden:Imprimir la lista de TODAS las variables de entorno

a diferencia de C, Lua no tiene envp** parámetro que se pasa a main(), así que no pude encontrar una manera de obtener una lista de todas las variables de entorno. ¿Alguien sabe cómo puedo obtener la lista del nombre y el valor de todas las variables de entorno ?

Respuesta

2

Este código se extrajo de un antiguo enlace 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; 
} 
+0

bueno, esta es una manera de resolver el problema usando C. Aparentemente no hay una función Lua pura que haga esto. Gracias de cualquier manera. – AlexStack

+2

@AlexStack, como lo menciona Nicol, no hay una función pura de Lua porque 'environ' no es ANSI C, solo POSIX. – lhf

5

Las funciones estándar de Lua se basan en funciones C estándar, y no existe una función C estándar para obtener todas las variables de entorno. Por lo tanto, tampoco hay una función estándar de Lua para hacerlo.

Tendrá que utilizar un módulo como luaex, que proporciona esta funcionalidad.

+2

C no tiene una función porque los parámetros argv a la función main() sirve para el propósito: http://stackoverflow.com/questions/2085302/printing-all-environment-variables-in-cc – AlexStack

+2

@AlexStack: No del todo. 'argv' se refiere a los argumentos de línea de comando pasados ​​al programa. 'envp' se refiere a variables de entorno, pero no es estándar. –

1

Puede instalar el módulo lua-posix. Por otra parte, las instalaciones de RedHat han incorporado en las rutinas de POSIX, pero a fin de que, lo que tiene que hacer un truco:

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 

El truco consiste en crear un enlace blando al directorio "io" de la RPM y para nombrar a la enlace suave con el mismo nombre de la biblioteca que LUA intentará abrir. Si no lo hace, obtendrá:

./librpmio.so: undefined symbol: luaopen_librpmio 

o similar.

0
local osEnv = {} 

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

esto no funcionaría en algunos casos, como "sin cáscara válida para el usuario que ejecuta la aplicación"

+0

También podría fallar si algunos nombres o valores de variables de entorno contienen líneas nuevas u otros caracteres divertidos. –

Cuestiones relacionadas