无法在 WSL 中导出环境变量
Can't export environment variable in WSL
我觉得我中风了。我目前 运行 WSL 中的以下导出命令:
export BROWSER=/mnt/c/Program\ Files/Mozilla\ Firefox/firefox.exe
但 WSL 似乎没有意识到 $BROWSER 已被覆盖,因为它保持 运行 它没有反斜杠:
echo $BROWSER
/mnt/c/Program Files/Mozilla Firefox/firefox.exe
当 运行 命令时导致以下错误:
$BROWSER
bash: /mnt/c/Program: No such file or directory
这是 WSL 中的错误吗?还是我设置环境变量有误?
编辑:
我也试过用引号代替斜线:
export BROWSER='/mnt/c/Program Files/Mozilla Firefox/firefox.exe'
欢迎来到 POSIX 兼容 shell 行为的痛苦世界。
在反斜杠中赋值"escape" space 个字符。这意味着它们不会被视为通常会终止字符串的 whitespace 。反斜杠被删除是因为它们达到了目的。这与环境变量无关。这就是反斜杠在 POSIX shell 中的工作方式。试试 echo a\ b\"c
.
然后,当您使用 $BROWSER
时,shell 将变量引用替换为变量的值。然后它根据 $IFS
变量的值拆分结果。由于 $IFS
通常包含 space、制表符和换行符,因此浏览器路径在嵌入的 space 上被拆分为三个不同的字符串。您可以通过 运行 printf "%s\n" $BROWSER
.
看到这种情况发生
解决办法是引用变量展开来抑制$IFS
分裂。换句话说,使用 "$BROWSER"
。事实上,您几乎应该始终将变量扩展放在双引号内。
我觉得我中风了。我目前 运行 WSL 中的以下导出命令:
export BROWSER=/mnt/c/Program\ Files/Mozilla\ Firefox/firefox.exe
但 WSL 似乎没有意识到 $BROWSER 已被覆盖,因为它保持 运行 它没有反斜杠:
echo $BROWSER
/mnt/c/Program Files/Mozilla Firefox/firefox.exe
当 运行 命令时导致以下错误:
$BROWSER
bash: /mnt/c/Program: No such file or directory
这是 WSL 中的错误吗?还是我设置环境变量有误?
编辑:
我也试过用引号代替斜线:
export BROWSER='/mnt/c/Program Files/Mozilla Firefox/firefox.exe'
欢迎来到 POSIX 兼容 shell 行为的痛苦世界。
在反斜杠中赋值"escape" space 个字符。这意味着它们不会被视为通常会终止字符串的 whitespace 。反斜杠被删除是因为它们达到了目的。这与环境变量无关。这就是反斜杠在 POSIX shell 中的工作方式。试试 echo a\ b\"c
.
然后,当您使用 $BROWSER
时,shell 将变量引用替换为变量的值。然后它根据 $IFS
变量的值拆分结果。由于 $IFS
通常包含 space、制表符和换行符,因此浏览器路径在嵌入的 space 上被拆分为三个不同的字符串。您可以通过 运行 printf "%s\n" $BROWSER
.
解决办法是引用变量展开来抑制$IFS
分裂。换句话说,使用 "$BROWSER"
。事实上,您几乎应该始终将变量扩展放在双引号内。