在 Zig 中,进程入口点 main(init: std.process.Init) 提供了预先加载的环境变量映射表 init.environ_map(类型为 *std.process.Environ.Map)。无需手动调用外部函数解析,即可直接读取、查询、添加及遍历环境变量。
主要操作包括:
env.get(key):根据键获取环境变量的值,若不存在返回null;env.contains(key):快速判断环境变量是否存在;env.put(key, value):插入或更新环境变量;env.iterator():获取迭代器遍历所有的环境变量键值对;env.orderedRemove(key)或env.swapRemove(key):移除指定环境变量。
//! Demonstrate reading, modifying, and iterating environment variables in Zig.
const std = @import("std");
const print = std.debug.print;
pub fn main(init: std.process.Init) !void {
// Environment variables are accessible via init.environ_map,
// which is an instance of std.process.Environ.Map.
const env = init.environ_map;
// 1. Read existing environment variables.
if (env.get("PATH")) |path| {
print("PATH is set (length: {d} bytes)\n", .{path.len});
}
const user_or_home = env.get("USER") orelse env.get("HOME") orelse "unknown";
print("USER or HOME: {s}\n", .{user_or_home});
// 2. Check if a specific variable exists.
const has_custom_var = env.contains("MY_APP_MODE");
print("MY_APP_MODE present initially: {}\n", .{has_custom_var});
try std.testing.expect(!has_custom_var);
// 3. Set or update an environment variable.
try env.put("MY_APP_MODE", "staging");
try std.testing.expect(env.contains("MY_APP_MODE"));
try std.testing.expectEqualStrings("staging", env.get("MY_APP_MODE").?);
print("Updated MY_APP_MODE: {s}\n", .{env.get("MY_APP_MODE").?});
// 4. Iterate over environment variables.
var count: usize = 0;
var it = env.iterator();
while (it.next()) |entry| {
count += 1;
// Print the first few entries as an example
if (count <= 3) {
print("Env #{d}: {s}={s}\n", .{ count, entry.key_ptr.*, entry.value_ptr.* });
}
}
print("Total environment variables count: {d}\n", .{env.count()});
try std.testing.expect(env.count() > 0);
// 5. Remove an environment variable.
const removed = env.orderedRemove("MY_APP_MODE");
try std.testing.expect(removed);
try std.testing.expect(!env.contains("MY_APP_MODE"));
print("Successfully removed MY_APP_MODE.\n", .{});
}