在Linux Bash或Windows Git Bash中运行Windows Cmd的set PATH命令会出现什么情况?
在Linux Bash或Windows Git Bash中运行Windows Cmd的set PATH命令会出现什么情况?
我来给你掰扯清楚这事哈!你是想写个能同时在Windows Cmd和Linux Bash里跑的脚本,加了这段Cmd的set PATH命令,结果在Git Bash或者Ubuntu的Bash里跑的时候没报错,但也没效果,想知道咋回事、安不安全,还有咋验证对吧?
为啥在Bash里跑这段命令没效果?
这俩shell的set命令完全不是一回事!Windows Cmd里的set是用来定义或修改环境变量的,但Bash里的set是用来设置shell选项或者位置参数的,根本不是干这个活的。而且Bash里识别变量是用$VAR,不是Cmd那套%VAR%,所以%USERPROFILE%和%PATH%在Bash里就是普通字符串,不会被解析成实际的变量值。
说白了,你在Bash里跑这段命令,它根本没get到你要改PATH的意图,只是执行了一个合法但完全不对路的set操作,自然啥变化都没有。
怎么验证这段命令的执行结果?
很简单,几步就能看出来:
- 执行命令前先打印当前PATH:
echo $PATH - 跑完你那两行命令后,再打印一次
echo $PATH,对比一下就会发现PATH完全没变化 - 也可以直接输入
set命令查看Bash的位置参数,你会发现它把整个"PATH=C:\Program Files\Git\bin;%USERPROFILE%\AppData\Local\Programs\Git\bin;%PATH%"当成了一个位置参数,这显然不是你要的改PATH的效果
在Linux里跑这段命令安全吗?
绝对安全!它只是给Bash的位置参数设了个无关紧要的字符串,既不会修改你的环境变量,也不会对系统造成任何影响,哪怕你执行了,只要开个新终端或者重启shell,这点小改动就没了,完全不用担心。
怎么实现“Cmd里改PATH,Bash里啥也不做”的需求?
你可以给脚本加个环境判断,让它自动识别当前运行的shell:
- 比如用Cmd和Bash都能理解的条件语法:
这段代码在Cmd里会正常执行set命令,而在Bash里,那个if判断会被当成无效命令执行失败,后面的set命令也不会跑,刚好实现你要的“跨shell兼容”效果。# 只在Windows Cmd中执行PATH设置 if "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" ( set "PATH=C:\Program Files\Git\bin;%USERPROFILE%\AppData\Local\Programs\Git\bin;%PATH%" )
备注:内容来源于stack exchange,提问作者Gabriel Staples
相关产品推荐
相关产品推荐

