关于环境变量的不完整总结

这篇文章最后更新的时间在六个月之前,文章所叙述的内容可能已经失效,请谨慎参考!

环境变量是什么

环境变量(environment variables)

在 Unix 系统通过初始化脚本启动时,环境变量通常会在此时被初始化,因此会被系统中的其它进程所继承。

在 Windows 系统中,环境变量存储在 Windows 注册表中。

在 cmd 里操作环境变量

  1. 查看全部环境变量
    set
    
  2. 设置环境变量
    set example=testvar
    
  3. 输出环境变量
    echo %path%
    
    • 访问环境变量和访问普通变量是一样的
    • 环境变量名大小写不敏感
  4. 删除环境变量
    set example=
    
  5. 修改环境变量
    • 可以直接覆盖原本的环境变量
    • 可以先删除再新建
  6. 给 path 添加新的路径
    set path=%path%;C:\Tools
    

cmd 里修改环境变量只影响当前的进程

在 powershell 里操作环境变量

PowerShell 提供了几种不同的方法来使用和管理环境变量

使用 variable 语法

  1. 查看全部环境变量
    ls Env:
    
  2. 设置环境变量
    $Env:example = "testvar"
    
  3. 输出环境变量
    echo $Env:example
    
    • 访问环境变量和访问普通变量是一样的
    • 环境变量名大小写不敏感
  4. 删除环境变量
    del Env:example
    
  5. 修改环境变量
    • 可以直接覆盖原本的环境变量
    • 可以先删除再新建
  6. 给 path 添加新的路径
    $Env:Path += ';C:\Tools'
    

cmdlet

  1. 查看全部环境变量
    Get-Item -Path Env:\*
    
  2. 设置环境变量
    New-Item -Path Env: -Name example -Value 'testvar'
    或
    Set-Item -Path Env:example -Value 'testvar'
    
  3. 输出环境变量
    Get-Item -Path Env:\example
    Get-Item -Path Env:\example | Select-Object -Property Value
    Get-Item -Path Env:\example | Select-Object -ExpandProperty Value
    
  4. 删除环境变量
    Remove-Item -Path Env:example
    
  5. 修改环境变量
    修改值
    Set-Item -Path Env:example -Value 'testvar2'
    重命名
    Rename-Item -Path Env:example -NewName example
    
  6. 给 path 添加新的路径
    Set-Item -Path Env:\Path -Value $Env:Path';C:\Tools'
    Set-Item -Path Env:\Path -Value ((Get-Item -Path Env:\Path | Select-Object -ExpandProperty Value)+';C:\Tools')
    

.NET 类

  1. 查看全部环境变量
    [Environment]::GetEnvironmentVariables()
    
  2. 设置环境变量
    [Environment]::SetEnvironmentVariable('example', 'testvar')
    
  3. 输出环境变量
    [Environment]::GetEnvironmentVariable('example')
    
  4. 删除环境变量
    [Environment]::SetEnvironmentVariable('example', '')
    
  5. 修改环境变量
    • 可以直接覆盖原本的环境变量
    • 可以先删除再新建
  6. 给 path 添加新的路径
    [Environment]::SetEnvironmentVariable('path', [Environment]::GetEnvironmentVariable('path') + ';C:\Tools')
    

保存环境变量的修改

Environment 能修改全局的或当前用户的环境变量,其它两种方法在默认情况下都是修改当前进程的环境变量。修改全局的环境变量可能会遇到权限的问题。

[Environment]::SetEnvironmentVariable('example', 'testvar', [EnvironmentVariableTarget]::Process)
[Environment]::SetEnvironmentVariable('example', 'testvar', [EnvironmentVariableTarget]::User)
[Environment]::SetEnvironmentVariable('example', 'testvar', [EnvironmentVariableTarget]::Machine)

在 windows 修改环境变量最保险的方式还是通过这里修改

此电脑 -> 属性 -> 高级系统设置 -> 环境变量

使用 wmic 操作环境变量

  1. 查看全部环境变量

    wmic ENVIRONMENT
    wmic ENVIRONMENT where "username='<system>'"
    
  2. 设置环境变量

    wmic ENVIRONMENT create name="JAVA_HOME",username="<system>",VariableValue="%javaPath%"
    
  3. 输出环境变量

    wmic ENVIRONMENT where "name='Path' and username='<system>'"
    
  4. 删除环境变量

    wmic ENVIRONMENT where "name='JAVA_HOME' and username='<system>'" delete
    

使用 wmic 修改环境变量时要注意作用域,如果没有指定 username ,可能会把所有用户和系统全局的环境变量一起修改。

其实 windows 里还有很多奇技淫巧可以修改环境变量

在 bash 里操作环境变量

  1. 查看全部环境变量
    printenv
    或
    export -p
    
  2. 设置环境变量
    export example=testvar
    
  3. 输出环境变量
    echo $PATH
    或
    printenv PATH
    
    • 访问环境变量和访问普通变量是一样的
    • 环境变量名大小写敏感
  4. 删除环境变量
    export -n example
    
  5. 修改环境变量
    • 可以直接覆盖原本的环境变量
    • 可以先删除再新建
  6. 给 path 添加新的路径
    export PATH=$PATH:/usr/local/nginx/sbin
    
    • 在 Linux 或 macOS 上,使用冒号 (:) 而不是分号 (;)

保存环境变量的修改

在 c 语言里操作环境变量

c 里有一系列的函数来操作环境变量

char *getenv(const char *name);
int putenv(char *string);
int setenv(const char *envname, const char *envval, int overwrite);
int unsetenv(const char *name);
char *secure_getenv(const char *name);
int clearenv(void);

例子

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
extern char **environ;
int main(int argc, char* argv[], char* envp[])
{
    for (int i = 0; envp[i] != NULL; ++i)
    {
        printf("%s\n", envp[i]);
    }
    printf("****\n");

    for (char **var = environ; *var != NULL; ++var)
    {
        printf("%s\n", *var);
    }
    printf("****\n");
    
    printf("%s\n", getenv("PATH"));
    printf("****\n");
    
    putenv("TEST=123");
    printf("%s\n", getenv("TEST"));
    printf("****\n");

    int overwrite = 1;
    setenv("TEST", "321", overwrite);
    printf("%s\n", getenv("TEST"));
    printf("****\n");
    
    unsetenv("TEST");

    clearenv();

    return 0;
}

其它语言操作环境变量也会有相应的语法,只要看一下文档就好了。

查看某个进程的环境变量

参考