c - 函数 chdir() 表现异常

标签 c linux shell chdir

int cmd_cd(char* argv[]) {
  if(argv[1] == NULL || strncmp("~", argv[1], 1) == 0){
    struct passwd *pw = getpwuid(getuid());
    if(argv[1] == NULL || strlen(argv[1]) == 1){
      argv[1] = pw->pw_dir;
    }
    else{
      char path[strlen(pw->pw_dir) + strlen(arg[1])];
      strcpy(path, pw->pw_dir);
      argv[1] = &argv[1][1];
      strcat(path, argv[1]);
      argv[1] = path;
    }
  }

  if(chdir(argv[1])<0) {
    printf("Not a valid path\n");
    return -1;
  }
  return 0;
}

上面是一段代码,我试图在其中制作一个玩具 linux shell。但是上面的代码在我输入时是错误的

$ cd ~/code

它按预期执行,但在下面的情况下它显示“不是有效路径”。我无法弄清楚为什么。

$ cd ~/code/[name_of_some_valid_directory]

最佳答案

path在退出它定义的 block 时被删除。

试试这个:

int cmd_cd(char* argv[]) {
  char *path = NULL;
  if(argv[1] == NULL || strncmp("~", argv[1], 1) == 0){
    struct passwd *pw = getpwuid(getuid());
    if(argv[1] == NULL || strlen(argv[1]) == 1){
      argv[1] = pw->pw_dir;
    }
    else{
      path = malloc(strlen(pw->pw_dir) + strlen(arg[1]));
      if (path == NULL){
        printf("Memory allocation failed\n");
        return -1;
      }
      strcpy(path, pw->pw_dir);
      argv[1] = &argv[1][1];
      strcat(path, argv[1]);
      argv[1] = path;
    }
  }

  if(chdir(argv[1])<0) {
    printf("Not a valid path\n");
    if (path != NULL) free(path);
    return -1;
  }
  if (path != NULL) free(path);
  return 0;
}

添加#include <stdlib.h>如果需要使用 malloc 到代码的开头和 free .

关于c - 函数 chdir() 表现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32890567/

相关文章:

linux - 删除包含下一行子字符串的几乎重复项

bash - Shell 脚本 - 在文件中智能替换并在第二个文件中查找

c - 隐藏 ^C 在 C 中按 ctrl-c

c - 非阻塞 pasv sock 和阻塞连接(主动)套接字

C 预处理器 : Stringify int with leading zeros?

linux - Linux 内核中 slab 内存管理的缓存着色

linux - 命令行参数到shell脚本的转换?

c++ - 为什么字符串文字是左值,而所有其他文字都是右值?

c - 这个函数分配是如何工作的?

linux - 在 Linux 中检查目录内容的脚本