如何用波浪号替换主目录? Linux的

时间:2018-02-13 05:06:19

标签: c++ linux tilde-expansion

我目前正在使用C ++创建一个shell,并且我已经能够使用getcwd()输出绝对目录作为提示,但是当用户到达主目录时,我想输出代字号而不是主页。目录

例如,而不是

  

[bb @ bbmachine bb]

我想输出

  

[bb @ bbmachine~]

我该怎么做?

3 个答案:

答案 0 :(得分:3)

首先阅读globbing,特别是glob(7)。对于以波形符~开头的路径的扩展,请考虑wordexp(3)glob(3)

要显示以主目录开头的路径,您需要获取该主目录。您可以使用getenv(3) getenv("HOME")(有可能失败的罕见病态案例)或getpwuid(3)(甚至getpw(3)getuid(2)的结果。主目录(getpwuid成功时)由pw_dir字段给出。另请参阅credentials(7)(和execve(2) ...)

罕见的病态案例getenv("HOME")getpwuid(getuid())失败或给出不一致的结果(关于用户的主目录)。我相信你应该发现失败,但你可能不关心不一致。另见environ(7)。您甚至可以考虑特定于GNU的secure_getenv(3)

顺便说一句,您可以缓存主目录,即在shell中计算一次。它不太可能经常改变。

您还可以决定使用realpath(3)规范化路径。

您肯定有极端情况:是否要将/home/john/../mary/显示为~/../mary,将/home/mary/显示为~mary,或者将其保留为/home/john/../mary })假设您的进程在john uid下运行? (并且johnmary都作为passwd(5)中的用户名与主目录/home/john//home/mary/一起存在。那么/home/john/../../proc/$$/maps(见proc(5))呢?

您需要决定如何处理这些角落或病态案例,以及记录 shell的行为。

(提到的函数有一个C API,您可能希望在C ++代码中使用extern "C"

答案 1 :(得分:2)

正是@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);

这应该会给你正确的想法,但请记住,文档和Google是你的朋友。String Reference

答案 2 :(得分:1)

您可以使用wordexp这样的内容:

var data =  {ListofLayers:[{"Key":"G1","Value":"park"}]}


$(document).ready(function(){
$.each(data.ListofLayers, function (key, value) {
    console.log(value.Key+":"+value.Value);
});
});

<强>输出:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>