Elixir中System.get_env读取含\n的环境变量出现额外反斜杠如何解决
问题原因
你遇到的不是System.get_env/1主动插入额外反斜杠的问题,根源在环境变量的写入环节:
使用单引号包裹内容导出环境变量时,Shell不会解析其中的\n转义序列,实际存入环境变量的是字面量的反斜杠+字符n两个字符。Elixir读取到的原始内容就是这两个字符,iex中显示为\\n只是Elixir的字符串默认转义展示规则,方便你区分字面反斜杠和实际转义字符,并非内容被额外修改。
解决方法
方案1:修改环境变量的导出逻辑(推荐)
直接在导出时让Shell把\n解析为真实换行符,后续读取就不需要额外处理:
- 如果使用Bash/Zsh等支持ANSI-C引号的Shell,使用
$'包裹内容即可自动解析转义序列:
export TEST_KEY=$'hello\nworld' && iex
此时在iex中读取的结果就是预期的带换行的字符串:
iex(1)> System.get_env("TEST_KEY") "hello\nworld" iex(2)> IO.puts(System.get_env("TEST_KEY")) hello world :ok
- 也可以直接在导出时输入真实换行:
export TEST_KEY="hello world"
方案2:读取后手动解析转义序列
如果无法修改环境变量的导出逻辑,可以在Elixir中对读取到的字符串做转义还原:
如果只需要处理\n换行,直接替换即可:
test_key = System.get_env("TEST_KEY") |> String.replace("\\n", "\n")
如果需要处理\t、\r等更多常见转义序列,可以自行扩展替换规则,或者使用对应工具函数实现完整转义解析。
内容的提问来源于stack exchange,提问作者bosey
相关产品推荐
相关产品推荐

