env::var în Rust

Citește valoarea unei variabile de mediu (HOME, PATH, setări proprii); dă Err dacă nu există.

Sintaxă
pub fn var<K: AsRef<OsStr>>(key: K) -> Result<String, VarError>

Ce face env::var

env::var("NUME") returnează Ok(valoare) dacă variabila de mediu există sau Err(VarError::NotPresent) dacă nu. Dacă valoarea nu este UTF-8 valid, primești Err(VarError::NotUnicode); varianta env::var_os returnează Option<OsString> și acceptă orice.

Variabilele de mediu sunt folosite des pentru configurare: PORT, DATABASE_URL, RUST_LOG. Un model obișnuit este env::var("PORT").ok().and_then(|p| p.parse().ok()).unwrap_or(8080).

Din ediția 2024, env::set_var și env::remove_var sunt unsafe: modificarea mediului nu este sigură dacă alte fire îl citesc în același timp. Apelează-le doar la pornire, înainte de a crea fire.

Parametri

Parametru Descriere
key Numele variabilei de mediu.

Ce returnează

Result<String, VarError>.

Exemple

Exemplul 1: Variabilă lipsă și valoare implicită

use std::env;

fn main() {
    match env::var("DEXBLOG_TEMA") {
        Ok(t) => println!("tema: {t}"),
        Err(e) => println!("DEXBLOG_TEMA: {e} ({e:?})"),
    }

    let port: u16 = env::var("DEXBLOG_PORT").ok().and_then(|p| p.parse().ok()).unwrap_or(8080);
    println!("port: {port}");
    println!("PATH este setat: {}", env::var("PATH").is_ok());
}

Rezultat

DEXBLOG_TEMA: environment variable not found (NotPresent)
port: 8080
PATH este setat: true

Exemplul 2: Setarea unei variabile (unsafe din ediția 2024)

Setăm variabila la pornirea programului, cât timp nu există alte fire. Procesele copil pornite după aceea o moștenesc.

use std::env;

fn main() {
    // SIGURANȚĂ: suntem la începutul lui main și nu există alte fire.
    unsafe {
        env::set_var("DEXBLOG_ORAS", "Iași");
    }
    println!("oraș: {:?}", env::var("DEXBLOG_ORAS"));

    unsafe {
        env::remove_var("DEXBLOG_ORAS");
    }
    println!("după remove_var: {:?}", env::var("DEXBLOG_ORAS"));
}

Rezultat

oraș: Ok("Iași")
după remove_var: Err(NotPresent)

Exemplul 3: Directorul utilizatorului

Valoarea lui HOME diferă de la un calculator la altul. Pe Windows, variabila echivalentă este USERPROFILE.

use std::env;

fn main() {
    let acasa = env::var("HOME").unwrap_or_else(|_| String::from("(necunoscut)"));
    println!("HOME = {acasa}");
}

Rezultat (depinde de calculator)

HOME = /home/ana

Greșeli frecvente

  • Scrii env::var("PORT").unwrap(): dacă variabila nu este setată, programul intră în panică. Dă o valoare implicită sau un mesaj clar.
  • Apelezi env::set_var fără unsafe în ediția 2024: eroarea call to unsafe function is unsafe. Mai bine, transmite valori unui proces copil cu Command::env.

Comenzi înrudite

  • env::vars: Iterator peste toate variabilele de mediu ale procesului, ca perechi (nume, valoare).
  • env::args: Argumentele din linia de comandă cu care a fost pornit programul; primul este numele programului.
  • Command: Pornește alt program (proces copil): new() alege programul, arg() și args() adaugă argumente.
  • env::current_dir: Returnează directorul de lucru curent al programului, față de care se calculează căile relative.