2011-10-03 21 views
7

Vorrei stampare un elenco di tutti i valori environment variables e i relativi valori. Ho cercato lo StackOverflow e alle seguenti domande si avvicinano, ma non mi rispondono:Stampa elenco di TUTTE le variabili di ambiente

a differenza di C, Lua non ha envp** parametro che è passato a main() quindi non sono riuscito a trovare un modo per ottenere un elenco di tutte le variabili di ambiente. Qualcuno sa come posso ottenere l'elenco del nome e del valore di tutte le variabili di ambiente ?

risposta

2

Questo codice è stato estratto da un vecchio collegamento 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

bene, questo è un modo per risolvere il problema usando C. Apparentemente non esiste una funzione Lua pura che faccia questo. Grazie comunque. – AlexStack

+2

@AlexStack, come accennato da Nicol, non esiste una funzione puramente Lua perché 'environ' non è ANSI C, solo POSIX. – lhf

5

Le funzioni Lua standard si basano su funzioni C standard e non esiste alcuna funzione standard C per ottenere tutte le variabili di ambiente. Pertanto, non esiste alcuna funzione standard Lua per farlo.

Dovrai utilizzare un modulo come luaex, che fornisce questa funzionalità.

+2

C non ha una funzione a causa di parametri argv alla funzione main() serve allo scopo: http://stackoverflow.com/questions/2085302/printing-all-environment-variables-in-cc – AlexStack

+2

@AlexStack: non del tutto. 'argv' si riferisce agli argomenti della riga di comando passati al programma. 'envp' si riferisce alle variabili di ambiente, ma non è standard. –

1

È possibile installare il modulo lua-posix. In alternativa, installazioni RedHat sono routine POSIX built-in, ma per consentire loro, quello che devi fare un trucco:

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 

Il trucco sta nel creare un soft-collegamento a una directory "io" del numero di giri e per nominare il soft-link lo stesso nome della libreria che LUA tenterà di aprire. Se non lo fai, ottieni:

./librpmio.so: undefined symbol: luaopen_librpmio 

o simile.

0
local osEnv = {} 

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

questo non avrebbe funzionato in alcuni casi, come "nessun shell valida per l'utente che esegue la vostra applicazione"

+0

Potrebbe anche non riuscire se alcuni nomi di variabili di ambiente o valori contengono newline o altri caratteri divertenti. –

Problemi correlati