写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
,那么它就可以了。
谢谢!
答案 0 :(得分: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;
}
}
轰!它正在运行。
这一课非常简单,但我认为它仍然是一个有用的提醒。