AJM*_*ica 6 cygwin environment-variables git-bash msys2 git-for-windows
在 Git Bash 和 Cygwin 中,我可以轻松访问 Windows%PROGRAMFILES%环境变量:
$ echo $PROGRAMFILES
C:\Program Files
$ echo ${PROGRAMFILES}
C:\Program Files
Run Code Online (Sandbox Code Playgroud)
但是,由于变量名称中的方括号/圆括号,我无法%PROGRAMFILES(X86)%以相同的方式访问:
$ echo $PROGRAMFILES(X86)
bash: syntax error near unexpected token `('
$ echo ${PROGRAMFILES(X86)}
bash: ${PROGRAMFILES(X86)}: bad substitution
$ echo ${PROGRAMFILES\(X86\)}
bash: ${PROGRAMFILES\(X86\)}: bad substitution
Run Code Online (Sandbox Code Playgroud)
当然,除非我使用命令提示符:
C:\Users\myname>echo %PROGRAMFILES(X86)%
C:\Program Files (x86)
Run Code Online (Sandbox Code Playgroud)
(我很少这样做!)
有没有办法转义环境变量名称中的括号,或者这些在类似 Bash 的环境中完全无效(因此无法访问)?
结果cygpath -F我们可以查询一些特殊的“文件夹ID”。以下输出 ID 以及系统的值。
for ((id=0;id<=64;id++))
do
F=$(cygpath -amF $id 2> /dev/null)
[[ -n "$F" ]] && echo "$id = $F"
done
Run Code Online (Sandbox Code Playgroud)
作为单行:
for ((id=0;id<=64;id++)); do F=$(cygpath -amF $id 2> /dev/null); [[ -n "$F" ]] && echo "$id = $F"; done
Run Code Online (Sandbox Code Playgroud)
同时我检查了代码。get_special_folder()中的函数随后cygpath.cc使用SHGetSpecialFolderLocation()和SHGetPathFromIDListW,因此值 42(十六进制 0x2a)对应于CSIDL_PROGRAM_FILESX86,因此只要 Windows 维护其 API 契约,我们就可以依赖它。
重要提示: “混合表示”( cygpath -m)——本质上是带有正斜杠而不是反斜杠的 Windows 路径——似乎在 Cygwin 风格(包括 MSYS2)中更加健壮和可移植!
下面是一个可以与 Git for Windows 和 Cygwin 中的 Bash 配合使用的解决方案(也应该与 MinGW 配合使用):
PF86="$(cygpath -u "$(env|tr -d '\r'|gawk -F= '$1 == "ProgramFiles(x86)" {print $2}')")"
Run Code Online (Sandbox Code Playgroud)
剩下的就是利用填充的环境变量。不过,建议检查输出是否返回空并采取相应措施。例子:
PF86="$(cygpath -u "$(env|tr -d '\r'|gawk -F= '$1 == "ProgramFiles(x86)" {print $2}')")"
[[ -n "$PF86" ]] || { echo "\${ProgramFiles(x86)} not set"; exit 1; }
Run Code Online (Sandbox Code Playgroud)
注: gawk通常可以用 代替awk。取决于 AWK 脚本的具体细节,但是这个脚本非常简单,它应该适用于大多数(如果不是所有)AWK 风格。
env成对列出环境变量key=value,每行一个tr -d '\r'从标准输入中删除所有回车并将结果写入标准输出gawk -F= '$1 == "ProgramFiles(x86)" {print $2}')"用作=字段分隔符并匹配ProgramFiles(x86)第一个字段。匹配时,它会打印字段 2(值)。cygpath -u,将路径从 Windows 转换为 Unix 表示形式请注意,有一个非常非常微妙的差异,导致\r(回车符)保留为从 Windows 程序捕获的输出值的一部分。对于上述内容tr -d '\r'可能不是绝对必要的,但我宁愿安全也不愿抱歉。
免责声明:虽然从严格意义上来说这可能不符合“漂亮”的标准,但事实证明它是解决当前问题的一个非常强大的解决方案。我在很多脚本中都使用过它,而且还很专业。我的一个应用程序是使用vswhere.exe,其众所周知的路径基于此子文件夹。这vswhere也是解决方法起源的案例之一tr -d '\r'。
注意:我没有改变上面的原始答案,但强烈推荐“混合表示”(cygpath -m)而不是“通用 Unix 表示”(我编的;cygpath -U)!
| 归档时间: |
|
| 查看次数: |
2134 次 |
| 最近记录: |