我目前正在使用C ++创建一个shell,并且我已经能够使用getcwd()输出绝对目录作为提示,但是当用户到达主目录时,我想输出代字号而不是主页。目录
例如,而不是
[bb @ bbmachine bb]
我想输出
[bb @ bbmachine~]
我该怎么做?
答案 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)。
您还可以决定使用realpath(3)规范化路径。
您肯定有极端情况:是否要将/home/john/../mary/
显示为~/../mary
,将/home/mary/
显示为~mary
,或者将其保留为/home/john/../mary
})假设您的进程在john
uid下运行? (并且john
和mary
都作为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>