f2h2h1.github.io

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

环境变量是什么

环境变量(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;
}

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

查看某个进程的环境变量

参考