首页 > 解决方案 > 在 C++ 程序中找不到环境变量 UID

问题描述

有人可以解释为什么我可以扩展PATH但不能UID使用以下代码:

#include <iostream>
#include <string>
#include <regex>

std::string ExpandEnvironmentVariables(std::string path)
{
    static std::regex env("\\$\\{([^}]+)\\}");
    std::smatch match;
    while (std::regex_search(path, match, env))
    {
        const char * s = getenv(match[1].str().c_str());
        const std::string var(s == NULL ? "(empty)" : s);
        path.replace(match[0].first, match[0].second, var);
    }

    return path;
}

int main(int argc, char* argv[])
{
    std::string UID = "${UID}";
    std::cout << UID << " ==> " << ExpandEnvironmentVariables(UID) <<  std::endl;

    std::string PATH = "${PATH}";
    std::cout << PATH << " ==> " << ExpandEnvironmentVariables(PATH) <<  std::endl;

    return 0;
}

输出是:

./ExpandEnvironmentVariables
${UID} ==> (empty)
${PATH} ==> /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games

bash 中存在 UID 变量:

echo $UID
1000

标签: c++bashg++environment-variables

解决方案


并非所有的 shell 变量都在 bash 中导出。您可以像这样检查 shell 变量状态:

$ declare -p UID
declare -ir UID="1000"

这意味着该变量具有整数属性 ( -i) 并且它是只读的-r)。导出的变量如下所示:

$ declare -p PATH
declare -x PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

-x意味着变量被导出并添加到子流程的流程环境中。


推荐阅读