在字符串中引用 Linux 用户名以打开文件
Reference Linux username in string to open file
我有一个配置文件,其中包含另一个需要打开的文件的路径。此文件路径引用 Linux 用户名:
/root/${USER}/workspace/myfile.txt
$USER 应转换为 Linux 用户名。
这不起作用,因为字符串存储在我的配置文件中,我无法使用 getenv()
。
还有其他方法可以实现吗?
您可以使用 wordexp 翻译“~”,这是一个 UNIX
路径元素,表示 HOME 目录。像这样:
#include <wordexp.h>
std::string homedir()
{
std::string s;
wordexp_t p;
if(!wordexp("~", &p, 0))
{
if(p.we_wordc && p.we_wordv[0])
s = p.we_wordv[0];
wordfree(&p);
}
return s;
}
然后从返回的路径中提取用户名。
但我通常这样使用std::getenv()
:
auto HOME = std::getenv("HOME"); // may return nullptr
auto USER = std::getenv("USER"); // may return nullptr
用getenv
获取用户名,用它替换路径中的$USER
。
非常简单的例子:
#include <iostream>
#include <string>
#include <cstdlib>
int main()
{
std::string path = "/root/$USER/workspace/myfile.txt";
const char* user = std::getenv("USER");
int pos = path.find("$USER");
if (user != nullptr && pos >= 0)
{
path.replace(pos, 5, user);
std::cout << path << std::endl;
}
}
我有一个配置文件,其中包含另一个需要打开的文件的路径。此文件路径引用 Linux 用户名:
/root/${USER}/workspace/myfile.txt
$USER 应转换为 Linux 用户名。
这不起作用,因为字符串存储在我的配置文件中,我无法使用 getenv()
。
还有其他方法可以实现吗?
您可以使用 wordexp 翻译“~”,这是一个 UNIX
路径元素,表示 HOME 目录。像这样:
#include <wordexp.h>
std::string homedir()
{
std::string s;
wordexp_t p;
if(!wordexp("~", &p, 0))
{
if(p.we_wordc && p.we_wordv[0])
s = p.we_wordv[0];
wordfree(&p);
}
return s;
}
然后从返回的路径中提取用户名。
但我通常这样使用std::getenv()
:
auto HOME = std::getenv("HOME"); // may return nullptr
auto USER = std::getenv("USER"); // may return nullptr
用getenv
获取用户名,用它替换路径中的$USER
。
非常简单的例子:
#include <iostream>
#include <string>
#include <cstdlib>
int main()
{
std::string path = "/root/$USER/workspace/myfile.txt";
const char* user = std::getenv("USER");
int pos = path.find("$USER");
if (user != nullptr && pos >= 0)
{
path.replace(pos, 5, user);
std::cout << path << std::endl;
}
}