无法在 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"。事实上,您几乎应该始终将变量扩展放在双引号内。