【问题标题】:Can't export environment variable in WSL无法在 WSL 中导出环境变量
【发布时间】:2020-03-22 02:57:41
【问题描述】:

我感觉自己中风了。我目前正在 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'

【问题讨论】:

  • 对该路径使用引号。
  • @Biswapriyo 感谢您的评论。使用export BROWSER='/mnt/c/Program Files/Mozilla Firefox/firefox.exe' 试一试,但没有区别。
  • 我实际上可以简单地使用 WSL2 运行 echo $BROWSER,因为它正在更正路径:$> export BROWSER=/mnt/c/Program\ Files/Mozilla\ Firefox/firefox.exe$> echo $BROWSER/mnt/c/Program Files/Mozilla Firefox/firefox.exe

标签: linux environment-variables windows-subsystem-for-linux


【解决方案1】:

欢迎来到与 POSIX 兼容的 shell 行为的痛苦世界。

赋值中的反斜杠“转义”空格字符。这意味着它们不会被视为通常会终止字符串的空格。反斜杠被删除是因为它们达到了它们的目的。这与环境变量无关。这就是反斜杠在 POSIX shell 中的工作方式。试试echo a\ b\"c

然后,当您使用$BROWSER 时,shell 将变量引用替换为变量的值。然后它根据$IFS 变量的值拆分结果。由于$IFS 通常包含空格、制表符和换行符,因此浏览器路径在嵌入的空格上被拆分为三个不同的字符串。您可以通过运行 printf "%s\n" $BROWSER 来看到这一点。

解决方法是引用变量扩展来禁止$IFS拆分。换句话说,使用"$BROWSER"。事实上,您几乎应该总是将变量扩展放在双引号内。

【讨论】:

  • 在这里感谢您的回答。 +1 我想知道您是否有比我在这里修复 WSL 中的 .env 更优雅的方法的建议? stackoverflow.com/a/62836810/470749
  • 抱歉,@Ryan,我对 Heroku 一无所知。您在链接到的评论中所做的只是绕过 .env 文件并在启动服务器之前设置环境变量。这与在运行任何其他命令之前执行 export SOME_VAR=some_val 没有什么不同。请注意,您的问题与 WSL 本身无关。 WSL 只是一个 Ubuntu Linux 用户空间。如果您实际上在 Windows 10 之外设置了基于 Ubuntu 的服务器,您会遇到同样的问题,因为问题在于您的 Heroku 和相关软件的配置,而不是 WSL。
  • ❤️ 感谢您的回复,并为不清楚的地方道歉:我与 Heroku 没有任何关系;那是提问者(不是我)。我想我很懒惰,没有写一个全新的问题。基本上我的情况就是 .env 一直对我有用,除了在 WSL 中开发时。我写了(作为对那个人的回答)我的 hacky 解决方法是什么。我很想更永久地解决它。感谢您花时间回复,我深表歉意。
猜你喜欢
  • 2020-07-20
  • 2019-03-01
  • 2011-02-09
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
相关资源
最近更新 更多