1

对编写 shell 很陌生。当我不提供任何额外参数时,我试图让“cd”进入主目录。

但是当我调用“cd”并且代码尝试调用时chdir(getenv("HOME")),它会显示一条错误消息"No such file or directory"

/*
  Builtin function implementations.
*/
int cd(char **args){
  if (args[1] == NULL){
    printf("%s\n", getenv("HOME"));
    if (chdir(getenv("HOME")) != 0) {
      perror("dsh");
    }
  } else if (chdir(args[1]) != 0){
    perror("dsh");
  }
  return 1;

}

getenv("HOME")确实给出了正确的目录,即"/Users/oasisweng"

我想我做错了什么。我应该在哪里修?如果可能,请告诉我为什么。

我在这里阅读了 chdir man但如果我手动输入cd /Users/oasisweng,那么它将起作用。

谢谢!!

4

1 回答 1

0

感谢您的所有帮助,我在找出答案时尝试遵循 MCVE 指南。因为有人标记了我的问题,所以我觉得我应该分享我的答案。

我发现问题是我最初设置$HOME.

所以基本上,我的 shell 在文件中读取$HOME$PATH变量profile。它看起来像这样:

PATH=/bin:/usr/bin:/usr/local/bin\n
HOME=/Users/oasisweng\n

=我用符号分割每一行,setenv并将右侧的值保存到左侧的名称中。

问题是该setenv函数也将保存\n$HOME调用时的一部分!

cd(getenv("HOME"))实际上cd("/Users/oasisweng\n")最后是换行符。它失败了,因为它应该是cd("/Users/oasisweng")

我的解决方案是在之前删除右侧每个值的换行符setenv

int remove_newline(char* str){
  char* rst = strchr(str,'\n');
  if (rst != NULL){
    *rst = '\0';
    //found and changed
    return 0;
  } else{
    //not found
    return 1;
  }
}

繁荣!它已启动并正在运行。

这一课非常琐碎,但我认为它仍然是一个有用的提醒。

于 2015-11-02T23:13:10.273 回答