【发布时间】:2021-03-16 07:50:29
【问题描述】:
我通过包装std::getenv、setenv 和environ 编写了用于在C++ 中处理环境变量的小型便利函数。除了设置和获取环境变量之外,我还提供了检查当前环境是否包含某个变量的功能。
#include <cstdlib>
#include <unistd.h>
template <typename VAR_TYPE>
void set(const std::string& variableName, VAR_TYPE varValue, bool overwrite = false) {
if (!setenv(variableName.c_str(), std::string(variableValue).c_str(), overwrite)) {
if (errno == ENOMEM) {
throw std::bad_alloc();
} else if (errno == EINVAL) {
throw std::invalid_argument("Variable name invalid: " + variableName);
} else {
throw std::runtime_error("Failed to set environment variable " + variableName);
}
}
}
std::string load(const std::string& variableName, const std::string& defaultValue = "") {
if (const char* envVariable = std::getenv(variableName)) {
return std::string(envVariable);
}
return defaultValue;
}
bool contains(const std::string& variableName) {
for (char** currentEnviron = environ; *currentEnviron; currentEnviron++) {
if (!std::strncmp(variableName.c_str(), *currentEnviron, variableName.length())) {
return true;
}
}
return false;
}
但是,by definition,这仅允许访问格式为 NAME=VALUE 的环境变量。
在bash 中,我可以执行以下操作:
$> export SOME_VAR
$> export -p | grep SOME_VAR
declare -x SOME_VAR
显然,SOME_VAR 是在某处定义的,即使我没有为其赋值。但是,当我运行 printenv(它使用我在包装器中使用的相同方法)时,SOME_VAR 未列出。我看过/proc/self/environ,但这仅列出了具有赋值的变量。
我的问题是:
- 定义为
SOME_VAR_WITH_VALUE=42和SOME_VAR_WITHOUT_VALUE的环境变量有什么区别。 - 在 C/C++ 中是否有可能访问没有值的环境变量?
【问题讨论】:
-
您的检查
-z $SOME_VAR不检查是否设置了SOME_VAR,但如果$SOME_VAR的长度为 0。如果未设置SOME_VAR或设置为空字符串,这将返回 true。 -
天哪,你是对的。我编辑了我的问题
标签: c++ c shell unix environment-variables