2011-10-03 64 views
7

Tôi muốn in danh sách tất cả environment variables và các giá trị của chúng. Tôi đã tìm kiếm các Stackoverflow và các câu hỏi sau đến gần nhưng không trả lời tôi:In danh sách TẤT CẢ các biến môi trường

không giống như C, Lua không có envp** tham số đã vượt qua main() vì vậy tôi không thể tìm thấy một cách để có được một danh sách của tất cả các biến môi trường. Có ai biết cách tôi có thể lấy danh sách tên và giá trị của tất cả các biến môi trường ?

Trả lời

2

Mã này được trích xuất từ ​​một ràng buộc POSIX cũ.

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

tốt, đây là một cách để giải quyết vấn đề bằng cách sử dụng C. Rõ ràng là không có chức năng thuần-Lua thực hiện điều này. Dù sao cũng cảm ơn bạn. – AlexStack

+2

@AlexStack, như đã đề cập bởi Nicol, không có hàm thuần-Lua vì 'môi trường' không phải là ANSI C, chỉ POSIX. – lhf

5

Chức năng Lua chuẩn dựa trên chức năng C-chuẩn, và không có hàm C chuẩn để nhận tất cả các biến môi trường. Do đó, không có hàm chuẩn Lua để thực hiện nó.

Bạn sẽ phải sử dụng mô-đun như luaex, cung cấp chức năng này.

+2

C không có một chức năng vì argv tham số cho() Chức năng chính phục vụ mục đích này: http://stackoverflow.com/questions/2085302/printing-all-environment-variables-in-cc – AlexStack

+2

@AlexStack: Không hoàn toàn. 'argv' đề cập đến các đối số dòng lệnh được truyền cho chương trình. 'envp' đề cập đến các biến môi trường, nhưng nó không chuẩn. –

1

Bạn có thể cài đặt mô-đun lua-posix. Ngoài ra, RedHat cài đặt đã thói quen POSIX built-in, nhưng để giúp họ, bạn phải làm một thủ thuật:

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 

Bí quyết là trong việc tạo ra một soft-link vào thư mục "io" của RPM và đặt tên cho các soft-link cùng tên của thư viện LUA sẽ cố mở. Nếu bạn không làm điều này, bạn nhận được:

./librpmio.so: undefined symbol: luaopen_librpmio 

hoặc tương tự.

0
local osEnv = {} 

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

điều này sẽ không làm việc trong một số trường hợp, như "không có vỏ hợp lệ cho người dùng chạy ứng dụng của bạn"

+0

Nó cũng có thể thất bại nếu một số tên hoặc giá trị biến môi trường có chứa các dòng mới hoặc các ký tự hài hước khác. –

Các vấn đề liên quan