我是不是错误地从 CLion 中的文件中获取环境变量,或者 env 文件语法不正确?

Posted

技术标签:

【中文标题】我是不是错误地从 CLion 中的文件中获取环境变量,或者 env 文件语法不正确?【英文标题】:Am I incorrectly sourcing environment variables from a file in CLion, or is env file syntax incorrect?我是否错误地从 CLion 中的文件中获取环境变量,或者 env 文件语法不正确? 【发布时间】:2021-04-01 09:56:18 【问题描述】:

我希望能够从 JetBrains CLion 中特定运行/调试配置中的文件中获取一个或多个环境变量。 据我所知,在撰写本文时,这个特殊问题has not been answered on Stack Overflow。我认为它应该对其他 JetBrains IDE 的用户有用。

主要来自 Python 背景,我大量使用 Python dotenv 库在文件中定义多个环境变量。 这些文件中的语法看起来像

VARIABLE_NAME=value

这看起来类似于我在 shell 脚本中定义(局部)变量的方式。

我过去使用过的其他语言都有模块(例如Julia、Node)或内置功能(例如R),它们都遵循VARIABLE=value 语法。 我希望从 IDE 中的文件中获取环境变量应该有类似的感觉。

要么 CLion 没有,我只是不知道,要么我偶然发现了错误配置(更有可能)或错误(不太可能)。

这个问题不是什么

我不想set CMake variables。我想将环境变量设置为通过std::getenv 对我的程序可见。

answer on a related question 推荐与 CLion 不兼容的 a plugin。此外,在运行/调试配置中对源环境文件的支持已经内置到 CLion 中,因此不需要插件。

我尝试了什么

最小的工作示例

这是一个打印环境变量的简单 C++ 程序:

#include <iostream>

int main() 
    auto test_val = getenv("TEST");
    std::cout << "TEST value: " << test_val << std::endl;

这里是/home/alan/Documents/20201222-clion-env-file-test/env的内容:

TEST=hello

(我尝试过使用和不使用换行符,但没有任何区别。)

损坏的运行/调试配置

尝试从此文件获取环境变量似乎不起作用:

预期产出
/home/alan/Documents/20201222-clion-env-file-test/cmake-build-debug/20201222_clion_env_file_test
TEST value: hello

Process finished with exit code 0
实际输出
/home/alan/Documents/20201222-clion-env-file-test/cmake-build-debug/20201222_clion_env_file_test
TEST value: 
Process finished with exit code 0

工作运行/调试配置

显式定义变量有效:

预期产出
/home/alan/Documents/20201222-clion-env-file-test/cmake-build-debug/20201222_clion_env_file_test
TEST value: hi

Process finished with exit code 0
实际输出
/home/alan/Documents/20201222-clion-env-file-test/cmake-build-debug/20201222_clion_env_file_test
TEST value: hi

Process finished with exit code 0

tl;博士

如果我从文件中设置环境变量,为什么 CLion 没有获取它们?

系统信息

CLion 2020.3
Build #CL-203.5981.166, built on December 1, 2020
...
Runtime version: 11.0.9+11-b1145.21 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Linux 5.8.0-7630-generic

【问题讨论】:

【参考方案1】:

CLion 不遵循预期的语法,但 documentation 没有明确说明:

使用 Load variables from file 字段将 CLion 指向配置环境的脚本。

线索是脚本这个词。如果您希望环境变量在脚本之外可用,则需要 export 它,就像在 shell 中一样:

alan@just-testing:~/Documents/20201222-clion-env-file-test$ cat ./env 
TEST=hello
alan@just-testing:~/Documents/20201222-clion-env-file-test$ source ./env && ./cmake-build-debug/20201222_clion_env_file_test 
TEST value: alan@just-testing:~/Documents/20201222-clion-env-file-test$

进行必要的更改会产生预期的结果:

alan@just-testing:~/Documents/20201222-clion-env-file-test$ cat env 
export TEST=hello
alan@just-testing:~/Documents/20201222-clion-env-file-test$ source ./env && ./cmake-build-debug/20201222_clion_env_file_test 
TEST value: hello

这是进行此更改后 CLion 的输出:

/home/alan/Documents/20201222-clion-env-file-test/cmake-build-debug/20201222_clion_env_file_test
TEST value: hello

Process finished with exit code 0

如果您最近有任何 C/C++ 经验,这可能很明显,但如果您像我一样使用 VARIABLE=value 语法提出解释型语言,这绝对不明显。

【讨论】:

以上是关于我是不是错误地从 CLion 中的文件中获取环境变量,或者 env 文件语法不正确?的主要内容,如果未能解决你的问题,请参考以下文章

Clion ROS开发环境设置

Clion(CMake工具)中如何引入第三方库

(23)Linux下Clion中搭建opencv环境

clion中toolchains中环境一直显示未找到,环境变量也配置了,有没有大神来解释一下?

CLion IDE:在 Windows 上使用 ssh 作为环境工具链,而不是 MinGW/Cygwin

有效地从 ArrayList 中获取子列表