Windows bash shell对$ProgramFiles(x86)环境变量的访问

Windows bash shell对$ProgramFiles(x86)环境变量的访问,windows,bash,git,command,Windows,Bash,Git,Command,在bash shell中,我使用git-bash.exe,如何访问windows 10 ProgramFiles(x86)环境变量 如果执行printenv,我会在输出中看到它,并注明大小写,但尝试使用echo$ProgramFiles(x86),echo$ProgramFiles\(x86\)和echo$”ProgramFiles(x86)访问它时不起作用 我可以使用echo$PROGRAMFILES访问该环境变量的非x86版本,而不会出现任何问题,并且可以执行相关的冒号删除和反斜杠,以便在P

在bash shell中,我使用git-bash.exe,如何访问windows 10 ProgramFiles(x86)环境变量

如果执行
printenv
,我会在输出中看到它,并注明大小写,但尝试使用
echo$ProgramFiles(x86)
echo$ProgramFiles\(x86\)
echo$”ProgramFiles(x86)
访问它时不起作用

我可以使用
echo$PROGRAMFILES
访问该环境变量的非x86版本,而不会出现任何问题,并且可以执行相关的冒号删除和反斜杠,以便在PATH环境变量更新中使用它所需的前向替换,例如
PATH=$PATH:“/${PROGRAMFILES/:\\\/}(x86)/某些带有空格的应用程序路径/”
后接确认所需结果的
echo$PATH
printenv PATH
。问题是,我宁愿不必编写ProgramFiles(x86)环境变量,也不愿在PATH环境变量的更新中直接使用它


在更新路径环境变量时,尝试使用windows APPDATA[=C:\Users\\APPDATA\Roaming]环境变量时,我需要能够不仅替换初始冒号和反斜杠,而且用正斜杠替换后续反斜杠。使用
echo${APPDATA/:\\/}
生成
C/Users\\AppData\Roaming
我不知道如何让bash环境变量字符匹配和替换语法涵盖这两种情况,以便生成更新PATH环境变量所需的
C/Users//AppData/Roaming

注意:该过程中存在缺陷如下所述。特别是,如果将某个环境变量设置为多行值,其中一个值行与
sed
表达式匹配,则也将捕获该行。为了避免这种情况,如果有可用的Python,可以使用:

python -c 'import os; print(os.getenv("FOO(BAR)"))'
比如说。如果未设置变量,这将打印
None
,因此您可能希望使其更美观:例如,提供默认值,或者如果未设置变量,则使用
sys.exit(1)
。(但是如果你有一个Python解释器,你可以考虑用Python编写而不是直接在BASH中编写)。
unixshell(sh、bash等)变量名(包括环境变量)约束为不包含括号的字符集。特别是,
“$FOO(BAR)”
始终解析为对变量
$FOO
的引用,后面是作为单独单词的
(BAR)
。即使使用大括号展开形式,如果单独的单词
(BAR)
在语法上无效,这一点也适用:

bash$ echo "${FOO(BAR)}"
bash: ${FOO(BAR)}: bad substitution
尽管如此,还是可以使用其他程序设置并访问这些变量。例如,使用Python我将
FOO(BAR)
设置为
hello

>>> import os
>>> os.environ["FOO(BAR)"] = "hello"
>>> import subprocess
>>> subprocess.call("bash")
bash$
此bash实例无法直接访问变量,但
env
打印所有变量:

bash$ env | grep FOO
FOO(BAR)=hello
bash$ setting="$(env | sed -n 's/^FOO(BAR)=//p')"
bash$ echo "$setting"
hello
如果您有
env
(您可能有)和
sed
,您可以将它们组合起来提取任意变量:

bash$ env | grep FOO
FOO(BAR)=hello
bash$ setting="$(env | sed -n 's/^FOO(BAR)=//p')"
bash$ echo "$setting"
hello
因此,假设WindowsBash没有任何特例可以更好地解决这个特殊的笨拙问题,同样的技巧也适用于“ProgramFiles(x86)”

用正斜杠替换多个反斜杠 主要是这样的:问题是您的模式专门查找
:\
,但是字符串有多个
\
没有冒号。您最好的选择可能是拥有一个真正理解Windows路径的程序或函数,因为它们的前面不一定有驱动器号(请参阅)。但此模式适用于所有反斜杠:

bash$ v='a\b\c'
bash$ echo ${v//\\/\/}
a/b/c
双斜杠的意思是“替换所有事件”。然后,模式为
\\
,它与一个反斜杠匹配。下一个斜杠引入替换字符串,即
\/
,表示一个正斜杠。(这也可以写成
/
,但奇怪的是,我发现这很难理解。)

当然,这并不能代替
C:
中的冒号,所以我们还需要一个替代。您不能在一个
${…}
扩展中执行此操作,因此诀窍是添加另一个扩展:

bash$ v='C:\a\b\c'
bash$ echo ${v//\\/\/}
C:/a/b/c
bash$ v1="${v//\\//}"; echo ${v1/:/}
C/a/b/c

将其放入一个shell函数中,您最终可以使其足够智能以处理所有有效路径,这样您就可以使用
local
来防止变量名
v1
泄漏。

注意:下面描述的过程中有一个缺陷。特别是,如果将某个环境变量设置为多行值,其中一个值行与
sed
表达式匹配,则也将捕获该行。为了避免这种情况,如果有可用的Python,可以使用:

python -c 'import os; print(os.getenv("FOO(BAR)"))'
比如说。如果未设置变量,这将打印
None
,因此您可能希望使其更美观:例如,提供默认值,或者如果未设置变量,则使用
sys.exit(1)
。(但是如果你有一个Python解释器,你可以考虑用Python编写而不是直接在BASH中编写)。
unixshell(sh、bash等)变量名(包括环境变量)约束为不包含括号的字符集。特别是,
“$FOO(BAR)”
始终解析为对变量
$FOO
的引用,后面是作为单独单词的
(BAR)
。即使使用大括号展开形式,如果单独的单词
(BAR)
在语法上无效,这一点也适用:

bash$ echo "${FOO(BAR)}"
bash: ${FOO(BAR)}: bad substitution
尽管如此,还是可以使用其他程序设置并访问这些变量。例如,使用Python我将
FOO(BAR)
设置为
hello

>>> import os
>>> os.environ["FOO(BAR)"] = "hello"
>>> import subprocess
>>> subprocess.call("bash")
bash$
此bash实例无法直接访问变量,但
env
打印所有变量:

bash$ env | grep FOO
FOO(BAR)=hello
bash$ setting="$(env | sed -n 's/^FOO(BAR)=//p')"
bash$ echo "$setting"
hello
如果您有
env
(您可能有)和
sed
,您可以将它们组合起来提取任意变量:

bash$ env | grep FOO
FOO(BAR)=hello
bash$ setting="$(env | sed -n 's/^FOO(BAR)=//p')"
bash$ echo "$setting"
hello
所以假设WindowsBash没有