10次发布
0.1.9 | 2024年2月1日 |
---|---|
0.1.8 | 2023年10月19日 |
0.1.5 | 2023年3月6日 |
#87 in 配置
每月154次下载
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::vars
和envvars
可能会给出不同的结果。
它是如何工作的
在底层,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