如何将主目录替换为波浪号?Linux
How to replace the home directory with a tilde? Linux
我目前正在C++中制作一个shell,我已经能够使用getcwd()输出绝对目录作为提示符,但是当用户到达主目录时,我想输出波浪号而不是主目录。
所以例如,而不是
[bb@bbmachine bb]
我想输出
[bb@bbmachine ~]
我该怎么做这样的事情?
首先阅读有关通配的信息,尤其是 glob(7)。对于以波浪号开头的路径的扩展~
请考虑 wordexp(3) 和 glob(3)。
要显示以主目录开头的路径,您需要获取该主目录。你可以使用 getenv(3) 像getenv("HOME")
(在极少数病理情况下可能会失败)或 getpwuid(3) (甚至 getpw(3)) 来计算 getuid(2) 的结果。主目录(getpwuid
成功时)由pw_dir
字段给出。另请参阅凭据(7)(和 execve(2)...)
在极少数情况下,getenv("HOME")
和getpwuid(getuid())
失败或给出不一致的结果(关于用户的主目录)。我相信你应该检测失败,但你可能不关心不一致。另见环境(7)。你甚至可以考虑GNU特定的secure_getenv(3)。
顺便说一句,您可以缓存主目录,即在您的 shell 中计算一次。它不太可能经常改变。
你也可以决定使用 realpath(3) 规范化路径。
您当然有极端情况:假设您的进程在john
uid 下运行,您是否希望将/home/john/../mary/
显示为~/../mary
、/home/mary/
、~mary
(甚至将其保留为/home/john/../mary
)?(john
和mary
都作为用户名存在于 passwd(5) 中,主目录为/home/john/
和/home/mary/
)。那么/home/john/../../proc/$$/maps
呢(参见proc(5))?
你需要决定如何处理这些角落或病理病例,并记录你的外壳的行为。
(提到的函数有一个 C API,你可能想在你的C++代码中使用extern "C"
)
正是@TheDude所说的。这是一些伪代码。
#include "pwd.h"
#include <string>
string home=getenv("HOME");
int location=yourPathString.find(home);
length=home.length();
originalLength=yourPathString.length();
string newString=yourPathString.substr(0,location);
newString+= "~";
newString+= yourPathString.substr(location+length,originalLength);
这应该给你正确的想法,但请记住,文档和谷歌是你的朋友。字符串引用
你可以使用 wordexp 这样的东西:
#include <wordexp.h>
// put all the horrible bits into a function
std::string wordexp(std::string var, int flags = 0)
{
wordexp_t p;
if(!wordexp(var.c_str(), &p, flags))
{
if(p.we_wordc && p.we_wordv[0])
var = p.we_wordv[0];
wordfree(&p);
}
return var;
}
int main()
{
auto const HOME = wordexp("~");
std::string path = "/home/galik/wibble";
if(path.find(HOME) == 0)
path.replace(0, HOME.size(), "~");
std::cout << path << 'n';
}
输出:
~/wibble
- 如何在 C++ 中创建一个适用于 Windwos 和 Linux 的文件夹(目录)
- 在 Ubuntu 16.04 的 usr/local/bin 中安装的 c++ 应用程序在从主目录执行时无法正常运行
- 如何使用 C++17 std::文件系统获取用户的主目录?
- 如何将主目录替换为波浪号?Linux
- C++ 将目录复制到另一个目录(Linux cp 命令)
- 在 Linux 上获取程序的目录
- Linux C++.链接共享对象和主对象
- 为什么我的文件/目录操作在Windows上工作正常,但在Linux上不能
- 关于 Linux .so 文件无法链接到主文件.cpp文件
- Linux正确的语法将通过config传递libstdc 的自定义目录
- 调试C :./nptl/sysdeps/unix/sysv/linux/raise.c:没有这样的文件或目录
- 如果文件/目录大小增加以上,有没有办法在Linux中重新呼叫
- 为什么我在Linux的C 中获得错误的当前目录
- 锁定目录的 C++ 解决方案 - Linux
- 如何将目录路径转换为唯一的数字标识符 (Linux/C++)
- 缺少libgomp:在主目录中安装c++编译器
- 似乎无法在主目录中调用类
- 编译一个文件时会在我的主目录中留下文件,以进行流浪提供
- 主目录中没有".cmake"文件
- 链接到我的主目录中的共享对象文件