从 PATH 变量中删除任何包含 space 的路径

Remove from PATH variable any paths that contains a space

我在 WSL 中交叉编译时遇到问题。问题是添加到 PATH 变量的某些 windows 路径包含 space,这会导致某些 Makefile 出错。

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Program Files/WindowsApps/TheDebianProject.DebianGNULinux_1.11.1.0_x64__76v4gfsz19hv4:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/WINDOWS/System32/OpenSSH/:/mnt/c/ProgramData/chocolatey/bin:/mnt/c/tools/lxrunoffline:/mnt/d/pe_kit/Windows Performance Toolkit/:/mnt/d/pe_kit/Microsoft Application Virtualization/Sequencer/:/mnt/c/Users/IG-88/AppData/Local/Microsoft/WindowsApps

我需要删除所有包含 space 的路径。我知道 sed 或 awk 可能会完成这项工作,但我自己似乎做不到。例如:

$ echo $PATH | some sed or awk command
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/WINDOWS/System32/OpenSSH/:/mnt/c/ProgramData/chocolatey/bin:/mnt/c/tools/lxrunoffline:/mnt/c/Users/IG-88/AppData/Local/Microsoft/WindowsApps

使用sed

$ echo $PATH | sed 's|:/mnt/[a-z]/[a-z_]*\?/\?[A-Za-z]* [A-Za-z]* \?[A-Za-z]*\?[^:]*||g'
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/WINDOWS/System32/OpenSSH/:/mnt/c/ProgramData/chocolatey/bin:/mnt/c/tools/lxrunoffline:/mnt/c/Users/IG-88/AppData/Local/Microsoft/WindowsApps

如果您使用的是bash,那么您可以

PATH=$(set -o noglob; IFS=':'; a=($PATH); IFS=' '; a=(${a[*]/* *}); IFS=':'; echo "${a[*]}")

示例:

myPATH="/win 1:/usr:/win 2:/usr/bin:/win 3:/usr/local/bin:/win 4"
(set -o noglob; IFS=':'; a=($myPATH); IFS=' '; a=(${a[*]/* *}); IFS=':'; echo "${a[*]}")
/usr:/usr/bin:/usr/local/bin

有很多方法,我觉得这个简短且相对可读:

PATH=$(grep -v '[[:space:]]'<<<"${PATH//:/$'\n'}"|paste -sd:) make

编辑:根据 KamilCuk 的建议。

如果根本没有 Windows,请将正则表达式替换为 '^/mnt/c/'。简单地 PATH=${PATH%%:/mnt/c/*} make 也可以,在你的情况下,我认为在一般情况下也应该没问题。除非你附加你在构建中需要的东西到 PATH。