Windows不同终端环境变量设置

最近在看go, go的变量配置 GOROOT GOPATH GO111MOUDLE真实头疼。在vs code里面用的是poweshell,go get下载包在power shell 里面和cmd里面不好使,git bash里面可以用,但是要改

GO111MOUDLE。总出现各种找不到包的情况。把3个终端的环境变量都看了下,是不是不一样。

属性设置

Win10 系统直接按 win 键搜索 env,

image-20210612220654734

选择环境变量

image-20210612220941727

为了测试, 先设置几个变量。

image-20210612222012422

cmd

查看

查看指定名称的环境变量,

1
2
3
4
5
6
7
8
C:\WINDOWS\system32>set path
Path=D:\Program\ImageMagick-7.0.10-Q16-HDRI;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin

C:\WINDOWS\system32>set gopath
环境变量 gopath 没有定义

C:\WINDOWS\system32>set goroot
GOROOT=D:\program\go

查看下for_test变量,可以看到打印了3个,系统变量和用户变量都打印了,当系统变量和用户变量同名时,用户变量会覆盖系统变量。

当然,如果换一个用户,看不到这个用户的环境变量,打印的应该是系统变量。

不区分大小写,且能匹配for_test*.

1
2
3
4
5
6
7
8
9
Microsoft Windows [版本 10.0.19042.1052]
(c) Microsoft Corporation。保留所有权利。

C:\Users\2B>set for_test
For_Test=hello user env
For_Test_System=hello system
For_Test_User=hello user

C:\Users\2B>

修改

1
2
3
4
5
6
C:\Users\2B>set for_test=hello user env m

C:\Users\2B>set for_test
For_Test=hello user env m
For_Test_System=hello system
For_Test_User=hello user

新开一个窗口查看下

1
2
3
4
C:\Users\2B>set for_test
For_Test=hello user env
For_Test_System=hello system
For_Test_User=hello user

没有改变,说明只是在当前会话有效。也可以到属性里面查看,值是没有修改的。

修改时也可采用%变量名% 引用已有的变量

1
2
3
4
5
6
7
C:\Users\2B>set for_test_cmd
for_test_cmd=999

C:\Users\2B>set for_test_cmd=%for_test_cmd%888

C:\Users\2B>set for_test_cmd
for_test_cmd=999888

增加

1
2
3
4
5
6
7
C:\Users\2B>set for_test_cmd
环境变量 for_test_cmd 没有定义

C:\Users\2B>set for_test_cmd=999

C:\Users\2B>set for_test_cmd
for_test_cmd=999

由修改可知,只是当前会话有效。

power shell

查看

dir env: 可打印所有变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
PS C:\Users\2B> dir env:

Name Value
---- -----
11JAVA_HOME C:\java\jdk-11.0.5
ALLUSERSPROFILE C:\ProgramData
ANACONDA_HOME C:\myprogram\anaconda
ANDROID_HOME D:\app_work\android_sdk
APPDATA C:\Users\2B\AppData\Roaming
asl.log Destination=file
CALIBRE C:\Program Files (x86)\Calibre2
ChocolateyInstall C:\ProgramData\chocolatey
ChocolateyLastPathUpdate 132308841601626161
CLASSPATH .;C:\java\jdk\lib\dt.jar;C:\java\jdk\lib\tools.jar
CommonProgramFiles C:\Program Files\Common Files
CommonProgramFiles(x86) C:\Program Files (x86)\Common Files
CommonProgramW6432 C:\Program Files\Common Files
COMPUTERNAME QQQ
ComSpec C:\WINDOWS\system32\cmd.exe
CUDA_PATH C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0
CUDA_PATH_V9_0 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0
DOCKER_TOOLBOX_INSTALL_PATH D:\program\Docker Toolbox
DriverData C:\Windows\System32\Drivers\DriverData
fake C:\Users\2B\AppData\Local\FakeApp\app-2.2.0\resources\api\torch\lib
FLUTER_HMOE D:\app_work\flutter
FLUTTER_STORAGE_BASE_URL https://mirrors.tuna.tsinghua.edu.cn/flutter
For_Test hello user env
For_Test_System hello system
For_Test_User hello user
GO111MODULE on
GOPROXY https://goproxy.cn

打印指定值,没有打印for_test_userfor_test_system, 是精确匹配

1
2
3
4
5
6
7
PS C:\Users\2B> $env:for_test
hello user env

// 未匹配到值没提示
PS C:\Users\2B> $env:for
PS C:\Users\2B> $env:for_test_user
hello user

修改

1
2
3
PS C:\Users\2B> $env:for_test=222
PS C:\Users\2B> $env:for_test
222

经测试,变量修改、增加也是当前会话有效。

增加

类似修改,修改是覆盖之前的值,如果之前没有,即使增加。

Power Shell的变量

PowerShell比cmd功能更丰富更强大,本身也支持更复杂的脚本语言。

采用 $env:var_name 能访问到环境变量, 直接用 $var_name 就能操作变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// powershell 内置变量
PS C:\Users\2B> $PSHome
C:\Windows\System32\WindowsPowerShell\v1.0
PS C:\Users\2B> $hi
PS C:\Users\2B> $hi=000
PS C:\Users\2B> $hi
0
// 做运算
PS C:\Users\2B> $hi=9*9
PS C:\Users\2B> $hi
81
// 字符串
PS C:\Users\2B> $b = '9+9'
PS C:\Users\2B> $b
9+9


PS C:\Users\2B> $PSHome =888
无法覆盖变量 PSHOME,因为该变量为只读变量或常量。
所在位置 行:1 字符: 1
+ $PSHome =888
+ ~~~~~~~~~~~~
+ CategoryInfo : WriteError: (PSHOME:String) [], SessionStateUnauthorizedAccessException
+ FullyQualifiedErrorId : VariableNotWritable

PS C:\Users\2B>

cmd尝试下计算. set的是字符串。不能识别为运算。

1
2
3
4
5
6
7
8
9
C:\Users\2B>set a =9*9

C:\Users\2B>set a
a =9*9
ALLUSERSPROFILE=C:\ProgramData
ANACONDA_HOME=C:\myprogram\anaconda
ANDROID_HOME=D:\app_work\android_sdk
APPDATA=C:\Users\2B\AppData\Roaming
asl.log=Destination=file

git bash

在安装git的时候,没有把git 添加到环境变量。cmd窗口无法使用git命令。

查看

大小写敏感,精确匹配。

1
2
3
4
5
6
7
8
9
10
11
2B@qqq MINGW64 ~
$ echo $for_test


2B@qqq MINGW64 ~
$ echo $For_Test
hello user env

2B@qqq MINGW64 ~
$

修改

1
2
3
4
5
6
7
8
2B@qqq MINGW64 ~
$ export For_Test=999

2B@qqq MINGW64 ~
$ echo $For_Test
999


修改时引用变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 初始值 666
2B@qqq MINGW64 ~
$ export For_Test="666"

2B@qqq MINGW64 ~
$ echo $For_Test
666

// 拼接自身
2B@qqq MINGW64 ~
$ export For_Test="666$For_Test"

// 成功
2B@qqq MINGW64 ~
$ echo $For_Test
666666

// 把变量放前面 这里是把 For_Test777 当成了一个变量 For_Test777 变量没有值
2B@qqq MINGW64 ~
$ export For_Test="$For_Test777"

// 相当于 $For_Test = $For_Test777 = 空
2B@qqq MINGW64 ~
$ echo $For_Test


2B@qqq MINGW64 ~
$ export For_Test=999

// 加上大括号
2B@qqq MINGW64 ~
$ export For_Test="${For_Test}777"

2B@qqq MINGW64 ~
$ echo $For_Test
999777

增加

1
2
3
4
5
6
7
8
9
10
11
2B@qqq MINGW64 ~
$ export hi=999

2B@qqq MINGW64 ~
$ $hi
bash: 999: command not found

2B@qqq MINGW64 ~
$ echo $hi
999

这里用到就是 bash 脚本的语法 .

总结

归根结底还是3种脚本语言语法的不同。在终端中增加和修改只是在当前窗口生效。那么在下载模块是,完全可以修改 GO111MODULE 的值,不会影响到开发环境。