10次发布

0.1.9 2024年2月1日
0.1.8 2023年10月19日
0.1.5 2023年3月6日

#87 in 配置

Download history 35/week @ 2024-03-13 23/week @ 2024-03-20 30/week @ 2024-03-27 44/week @ 2024-04-03 108/week @ 2024-04-10 100/week @ 2024-04-17 115/week @ 2024-04-24 68/week @ 2024-05-01 80/week @ 2024-05-08 52/week @ 2024-05-15 100/week @ 2024-05-22 90/week @ 2024-05-29 81/week @ 2024-06-05 21/week @ 2024-06-12 3/week @ 2024-06-19 41/week @ 2024-06-26

每月154次下载

Apache-2.0

44KB
882

envvars

envvars帮助检测可用的shell列表和相关环境变量。它分两步工作

  • 检测可用的shell列表并为每个找到的shell创建Profile
  • 为所选或每个shell加载环境变量列表

用法

获取所有可用的(检测到的)shell及其相关的环境变量列表

use envvars::{get_profiles, Profile};

// ...
let mut profiles: Vec<Profile> = get_profiles().unwrap();

// By default profile doesn't have loaded list of environment variables.
// It should be loaded calling method load().
profiles.iter_mut().for_each(|profile| {
    // Attempt to load envvars
    if let Err(err) = profile.load() {
        eprintln!("Cannot load envvars for {}: {err}", profile.name);
    }
    if let Some(envvars) = &profile.envvars {
        println!("Environment variables for {}", profile.name);
        envvars.iter().for_each(|(key, value)| {
            println!("{key}: {value}");
        });
    }
});

提取没有shell上下文的环境变量。

use std::collections::HashMap;
use envvars::get_context_envvars;

// ...
let vars: HashMap<String, String> = get_context_envvars().unwrap();

assert!(vars.contains_key("PATH") || vars.contains_key("Path") || vars.contains_key("path"));

std::env::vars的区别

envvars实际上会执行每个找到的shell,这意味着:在请求环境变量列表之前,目标shell的所有设置都将被初始化。如果某些shell的配置包括一些初始化脚本,这些脚本会影响环境变量,那么这会非常敏感。这意味着在某些情况下,std::env::varsenvvars可能会给出不同的结果。

它是如何工作的

在底层,envvars会取每个shell,并使用一个命令执行它,该命令将环境变量列表输出到stdout。执行完成后,envvars会读取stdout并将环境变量解析到HashMap<String, String>

由于提取过程可能需要敏感的时间(Windows上约1秒,Unix-based OS上约10毫秒),envvars不会在检测shell的配置文件时提取环境变量。这是开发者的决定,当它应该为所选或每个配置文件执行时。

envvars在系统的临时文件夹中创建一个小的可执行应用程序。这个应用程序用于将环境变量列表“丢弃”到父进程的stdout中,并做其他任何事情。当envvars实例被丢弃时,应用程序将从磁盘上删除。

出于安全原因,envvars在每次使用提取器之前都会检查其校验和。如果校验和无效(文件损坏/更改等),envars将删除损坏的文件并创建一个新的。

Unix特定

envvars读取/etc/shells并分析列表中的每个shell

Windows特有

envvars检查后续shell的可用性

  • 命令提示符
  • Windows PowerShell
  • .NET Core PowerShell全局工具
  • Cygwin x64
  • Cygwin
  • bash (MSYS2)
  • GitBash

保证结果

因为envvars尝试初始化每个shell并将环境变量列表“丢弃”到stdout,所以shell应该支持将命令作为参数的可能性,例如:/bin/bash -c path_to_command。显然不是很多,但仍然有一些shell不支持它(如Windows命令提示符)。在这种情况下,您仍然可以使用get_context_envvars()来获取不带shell上下文的环境变量列表。

依赖项

~2–10MB
~116K SLoC