#env-var #variables #recursion #up #defined #lookup #recursively

recursive-env

查找由其他环境变量定义的环境变量

2 个版本

0.1.1 2023年10月10日
0.1.0 2023年10月10日

#14 in #recursively

MIT/Apache

21KB
443

recursive-env

查找由其他环境变量构建的环境变量

原因

Shell 环境变量应该递归评估

$ TEST1="test1"
$ TEST2="${TEST1} test2"
$ echo $test
test1 test2

但有时工具设置环境变量而不先评估它们。以下是一个简单的程序

fn main() {
    env::set_var("TEST1", "test1");
    env::set_var("TEST2", "${TEST1} test2");
    for (key, value) in env::vars() {
        println!("{key}: {value}");
    }
}
// TODO: rewrite examples here with asserts. Run theses as part of tests

这将把 'TEST2' 设置为字面字符串 "${TEST1} test2",而不是评估为 "test1 test2"。

$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.02s
    Running `target/debug/test`
TEST1: test1
TEST2: ${TEST1} test2

解决方案是通过 recursive_env::var() 而不是 std::env::var()

use recursive_env::lookup;
fn main() {
    env::set_var("TEST1", "test1");
    env::set_var("TEST2", "${TEST1} test 2");
    for (key, _) in env::vars() {
        let fixed = lookup(key)
        println!("{key}: {fixed}");
    }
}
$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.02s
    Running `target/debug/test`
TEST1: test1
TEST2: test1 test2

注意事项

  • 子表达式不会被评估
use recursive_env::lookup;
fn main() {
    let key = "KEY";
    let value = String::from("$(subexpression)");
    env::set_var(&key, &value);
    assert_eq!(lookup::var(key).unwrap(), value);
}

依赖项

~130KB