chdir(getenv(" HOME")提示错误"没有这样的文件或目录"

时间:2015-11-02 19:06:17

标签: c posix chdir getenv

写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 here,但如果我手动输入cd /Users/oasisweng,那么它就可以了。

谢谢!

1 个答案:

答案 0 :(得分:0)

感谢您的帮助,我在确定答案时尝试遵循MCVE指南。因为一个人标记了我的问题,我觉得我应该分享我的答案。

我发现问题是我最初设置$HOME的方式。

基本上,我的shell会在文件$HOME中读取$PATHprofile个变量。它看起来像这样:

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;
  }
}

轰!它正在运行。

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