2016-11-15 5 views
0

Кусок кода выглядит следующим образом:не удается получить доступ к переменной окружения в Русте

// 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 не существует, но они печатаются в коде ржавчины.

Есть что-то, что я принципиально не понимаю о переменных профиля/системы env, на которые смотрит Rust (которые, я предположил, являются переменными в среде, в которой запущен процесс).

ОБНОВЛЕНИЕ: Я не знаю, что меняю, но он работает сейчас. Прошу прощения за вторжение во все время. Спасибо, что помогли мне разобраться в этом.

+1

Просто для того, чтобы быть уверенным: 'you'llneverknow' является просто заменой для этого вопроса? Существуют ли какие-либо символы, отличные от ASCII, в реальном знаке бота? –

+1

@LukasKalbertodt Вы говорите, что символы, отличные от ASCII, в любом случае неизвестны? –

+1

@BillWoodger Нет, все в порядке. Но если это замена, реальный токен может содержать символы, отличные от ASCII. –

ответ

0

Этот вопрос был отменен, потому что я получил ответ. Но это потому, что я не изучал все факторы, прежде чем задавать вопрос.

Это сработало, когда я побежал cargo run, но не работал, когда я побежал sudo cargo run. Я запускал его в sudo, потому что пытался прочитать память другого процесса. Профиль sudo имеет собственный набор env vars, и он сбрасывает среду, прежде чем отправляться в sudo.

Чтобы это исправить, я побежал sudo visudo и вставил эту строку

Defaults env_keep += "DISCORD_TOKEN'

Оттуда он работал.

This link получил ответ.