该段代码如下:
// Log in to Discord using a bot token from the environment
let discord = Discord::from_bot_token(
&env::var("DISCORD_TOKEN").unwrap()
).expect("login failed");
我收到错误消息,提示无法找到环境变量
DISCORD_TOKEN
。
我的环境确实显示了变量:
myawesomename$env | grep DISCORD
DISCORD_TOKEN=you'llneverknow
如果我打印 Rust 知道的所有键和值:
for (key, value) in env::vars() {
println!("{}: {}", key, value);
}
它不显示环境变量。
类似地,当我执行
env | grep CARGO
时,任何 CARGO 变量都不存在,但它们会打印在 Rust 代码中。
我根本不理解 Rust 正在查看的配置文件/系统环境变量(我认为它们是启动进程的环境中的变量)。
更新:我不知道我改变了什么,但现在可以了。对于打扰大家的时间我深表歉意。不过还是谢谢你帮我调查这个问题。
取消删除这个问题,因为我得到了答案。但这是因为我在提出问题之前没有检查所有因素。
当我运行
cargo run
时它有效,但当我运行sudo cargo run
时它不起作用。我在 sudo 中运行它是因为我试图读取另一个进程的内存。 sudo
配置文件有它自己的一组环境变量,它会在使用 sudo 之前重置环境。
为了解决这个问题,我运行了
sudo visudo
并插入了这一行
Defaults env_keep += "DISCORD_TOKEN'
从那里开始,它起作用了。
这个链接给了我答案。
我知道那是很久以前的事了,但万一有人正在为此苦苦挣扎:
就我而言,这是因为我的 shell 是
Fish
并且我的变量是在 Bash
中定义的。
我推测 Rust
env::var()
会读取它找到的任何内容,无论在哪里。
所以在我的鱼中:
set -x MY_VAR "value"
或者在 Bash 中:
export MY_VAR="value"