用Zig写一个Shell 02:PATH与外部命令
我们平时在 Shell 中使用的 ls、cat 等命令都是外部命令,我们在控制台输入 “which xxx”,可以定位 xxx 命令的具体路径。以 Windows 为例:
1 2 3 4
| PS > which ls D:/w64devkit/bin/ls.exe PS > which cat D:/w64devkit/bin/cat.exe
|
我这里因为安装了 w64devkit,所以能够正常使用 ls、cat 等命令,所以以上输出可能在你的电脑上不会出现。
那么 Shell 是怎么找到这些命令的路径并调用的呢?
环境变量
对于外部命令,Shell 会借助 PATH 环境变量进行定位。PATH 变量储存了一系列目录路径,各路径之间通过 ; 进行分隔(Linux 下通过 : 进行分隔)。Shell 会按照 PATH 中目录的顺序进行查找,一旦在某一目录下找到了对应的可执行文件,就直接调用该路径下的命令。使用 “echo $env:PATH” 可以打印环境变量。
1 2
| PS > echo $env:PATH C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.8\libnvvp;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v13.0\bin\x64;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v13.0\bin;C:\Program Files\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\Common Files\Oracle\Java\java8path;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:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA App\NvDLISR;C:\Program Files\dotnet\;D:\Git\cmd;D:\Sunshine;D:\Sunshine\tools;D:\mingw64\bin;D:\serialplot\bin;C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility;C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\;D:\nodejs\;D:\CTF\010 Editor;D:\CMake\bin;C:\Program Files\Wolfram Research\WolframScript\;C:\Program Files\NVIDIA Corporation\Nsight Compute 2025.1.1\;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Users\Admin\.local\bin;C:\Users\Admin\AppData\Local\Programs\Python\Python313\Scripts\;C:\Users\Admin\AppData\Local\Programs\Python\Python313\;C:\Users\Admin\.cargo\bin;C:\Users\Admin\AppData\Local\Microsoft\WindowsApps;D:\Microsoft VS Code\bin;D:\CLion 2025.2.2\bin;C:\Python27\Scripts\;C:\Python27\;C:\Users\Admin\AppData\Roaming\npm;D:\w64devkit\bin;C:\Users\Admin\AppData\Local\Programs\Ollama;C:\Users\Admin\AppData\Local\Microsoft\WinGet\Packages\nginxinc.nginx_Microsoft.Winget.Source_8wekyb3d8bbwe\nginx-1.29.7;C:\Users\Admin\.local\bin;C:\Users\Admin\.bun\bin;C:\Users\Admin\sox\sox-14.4.2;C:\Users\Admin\AppData\Local\Microsoft\WinGet\Packages\Microsoft.Sysinternals.ProcessMonitor_Microsoft.Winget.Source_8wekyb3d8bbwe;C:\Users\Admin\AppData\Local\Microsoft\WinGet\Packages\XAMPPRocky.Tokei_Microsoft.Winget.Source_8wekyb3d8bbwe;C:\Users\Admin\AppData\Local\Microsoft\WinGet\Packages\zig.zig_Microsoft.Winget.Source_8wekyb3d8bbwe\zig-x86_64-windows-0.16.0;;C:\Users\Admin\AppData\Local\Programs\codecrafters
|
在 Linux 环境下或者使用 Bash 时,可以使用 “echo $PATH” 打印环境变量
todo!