#c #shell #replace #directory #path
#c #оболочка #заменить #каталог #путь
Вопрос:
У меня проблема с попыткой сделать так, чтобы домашний каталог был «~» в приглашении для моей собственной оболочки. Я получаю каталог, связываю его со всем каталогом, но когда он найден, и я хочу изменить его на «~» для моего приглашения, вся оболочка сегментируется. Есть идеи, как изменить только домашний каталог из моего пути к каталогу на ~? Вот пример кода с memset, я также пробовал memcpy и strncpy / strcpy:
char *prompt_line(void) {
if(last_status == 0){
printf("[🙂]");
number_displayed ;
}
else{
printf("[🤮]");
number_displayed ;
}
char *username = getlogin();
char hostname[16];
char directory[55];
struct passwd *pw = getpwuid(getuid());
const char *homedir = pw->pw_dir;
getcwd(directory, sizeof(directory));
char *ret = strstr(directory, homedir);
memcpy(ret, "~", 6);
gethostname(hostname, 64);
sprintf(prompt_str, "-[%d]-[%s@%s:%s]$", number_displayed, username, hostname, ret);
return prompt_str;
}
Комментарии:
1. Где вы объявили
prompt_str
?2.
memset()
создаст что-то вроде~~~~~~~~~~~~~
, а не одно~
.3.Вам нужно позвонить
getcwd(directory, sizeof(directory))
перед вызовомstrstr()
.4. Извините, я изменил его сейчас, и он работает с самого первого раза, но после сбоя
5. Вам нужно проверить
strstr()
, возвращено ли значение, отличное от NULL.
Ответ №1:
memcpy(ret, "~", 6)
неверно. В нем всего 2 байта "~"
( ~
символ и нулевой ограничитель), вы не можете скопировать из него 6 байт.
Вам нужно поместить результат в новую строку для объединения ~
с остальной частью каталога.
char prompt_dir[55];
char *ret = strstr(directory, homedir);
if (ret == directory) {
if (strcmp(directory, homedir) == 0) { // in homedir, prompt is just ~
strcpy(prompt_dir, "~");
} else { // in subdirectory, prompt is ~/subdir
sprintf(prompt_dir, "~/%s", directory strlen(homedir) 1); // skip past homedir and / character
}
} else {
strcpy(prompt_dir, directory);
}
gethostname(hostname, 64);
sprintf(prompt_str, "-[%d]-[%s@%s:%s]$", number_displayed, username, hostname, prompt_dir);