我想打印所有environment variables及其值的列表。我搜索了Stackoverflow,接下来的问题很接近,但没有回答我:
与C不同,Lua没有传递给envp**
的{{1}}参数,所以我找不到获取所有环境变量列表的方法。有谁知道如何获得所有环境变量的名称和价值列表 ?
答案 0 :(得分:5)
标准Lua函数基于C标准函数,并且没有C标准函数来获取所有环境变量。因此,也没有Lua标准功能。
您必须使用luaex这样的模块,它提供此功能。
答案 1 :(得分: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;
}
答案 2 :(得分:1)
您可以安装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
或类似。
答案 3 :(得分:0)
local osEnv = {}
for line in io.popen("set"):lines() do
envName = line:match("^[^=]+")
osEnv[envName] = os.getenv(envName)
end
这在某些情况下不起作用,例如"运行你的应用的用户没有有效的shell"
答案 4 :(得分:0)
简单的 2 衬里:
buf = io.popen("env", '*r')
output = buf:read('*a')
print(output) -- or do whatever