如何在Rust中正确执行zsh -c "echo -n $ZSH_CUSTOM"命令?
问题解决:Rust执行zsh命令获取ZSH_CUSTOM为空的修复
问题原因
直接用zsh -c "echo -n $ZSH_CUSTOM"时,zsh是以非交互式非登录shell模式启动的,不会自动加载~/.zshrc、~/.zprofile等配置文件,而ZSH_CUSTOM变量正是在这些配置中定义的,因此执行时变量未被初始化,输出为空。而终端中的zsh是交互式登录shell,会自动加载配置,所以能正常输出变量值。
修复方案
让zsh以登录shell模式启动,通过-l参数触发配置文件加载,同时用安全的参数传递方式避免解析问题:
Rust代码示例
use std::process::Command; fn main() { let output = Command::new("zsh") .arg("-lc") .arg("echo -n $ZSH_CUSTOM") .output() .expect("执行命令失败"); println!("{}", String::from_utf8_lossy(&output.stdout)); }
关键说明
-l参数:让zsh以登录shell身份启动,会自动加载系统和用户的zsh配置文件,确保ZSH_CUSTOM变量被正确初始化。- 分参数传递:用
.arg()分别传递命令参数,避免字符串拼接带来的shell解析问题,比直接写完整命令字符串作为单个参数更可靠。
备选方案(按需选择)
如果不想启动登录shell,也可以手动指定加载配置文件:
use std::process::Command; fn main() { let output = Command::new("zsh") .arg("-c") .arg("source ~/.zshrc && echo -n $ZSH_CUSTOM") .output() .expect("执行命令失败"); println!("{}", String::from_utf8_lossy(&output.stdout)); }
这种方式仅加载~/.zshrc,适合不需要完整登录配置的场景,但要确保配置文件路径正确。
内容的提问来源于stack exchange,提问作者Steve Lau
相关产品推荐
相关产品推荐

