![Windows 的 where 实用程序是否仅搜索系统路径,而不是当前终端路径?](https://linux22.com/image/1621490/Windows%20%E7%9A%84%20where%20%E5%AE%9E%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%98%AF%E5%90%A6%E4%BB%85%E6%90%9C%E7%B4%A2%E7%B3%BB%E7%BB%9F%E8%B7%AF%E5%BE%84%EF%BC%8C%E8%80%8C%E4%B8%8D%E6%98%AF%E5%BD%93%E5%89%8D%E7%BB%88%E7%AB%AF%E8%B7%AF%E5%BE%84%EF%BC%9F.png)
我正在 Windows 中编写 Makefile,并尝试找到arm-none-eabi-gcc.exe
系统中安装的文件夹,因此如果该文件夹发生变化,我的 Makefile 不会中断。
我尝试使用它where
来获取编译器的完整路径,但我注意到一个奇怪的行为:它似乎在系统变量中搜索,而不是在当前终端 PATH 变量中搜索。它们会有所不同,因为我手动添加了安装PATH
文件夹。arm-none-eabi-gcc.exe
这个想法是,Makefile 看到的 PATH 变量可能在调用它们之前由另一个脚本设置,因此系统和当前终端 PATH 可能不同。
我不使用setx
是一个可能的解决方案,因为我不想永久更改系统路径,我只需要为当前 shell 添加编译器文件夹。最终用途是构建服务器,其中我们有相同工具链的不同版本,我不能将它们全部放在系统 PATH 中。
我将使用 Meld 来说明我的观点。我将 Meld 的文件夹添加到 PATH 中,如下所示:
set PATH="C:\Program Files (x86)\Meld";%PATH%
如果我打电话
C:\>meld
它确实打开了 Meld。如果我检查 PATH 变量本身:
C:\>PATH
PATH="C:\Program Files (x86)\Meld";C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin;
但如果我这么做
C:\>where meld
INFO: Could not find files for the given pattern(s).
我的系统上安装了 Mingw-W64,因此我的系统路径中的一个文件夹是C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin
,因此如果我输入
C:\>where gcc
C:\mingw-w64\i686-8.1.0-posix-dwarf-rt_v6-rev0\mingw32\bin\gcc.exe
是什么赋予了?
有没有办法where
在当前 shell 的 PATH 变量中进行搜索?
要明确的是:我希望where
表现得像 POSIXwhich
实用程序。
谢谢。
答案1
该where
命令搜索当前目录和 PATH 环境变量中指定的路径。
您可以使用/R
开关从以下位置开始递归搜索并显示与给定模式匹配的文件:指定的目录。使用/R
开关会导致 PATH 环境变量不是正在被搜索。例如:
其中 /R c:\test *.exe
将查找其所有子目录.exe
中的所有文件。它将c:\test
不是搜索路径。
答案2
事实证明,这where
是一个糟糕的应用程序,它对双引号过于挑剔。
如果我设置 PATH 变量时新条目周围没有双引号:
set PATH=C:\Program Files (x86)\Meld;%PATH%
然后where
找到应用程序:
C:\>where meld
C:\Program Files (x86)\Meld\Meld.exe
如果进入 GUI 并添加"C:\Program Files (x86)\Meld"
(注意双引号),GUI 会删除双引号。
还要注意,setx
如果 PATH 变量长度超过 1024 个字符,则可能会造成破坏。setx
破坏了我的系统 PATH 变量,我不得不手动恢复它。