【发布时间】:2015-11-02 19:06:17
【问题描述】:
对编写 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,那么它将起作用。
谢谢!!
【问题讨论】:
-
该代码没有问题。考虑发布MCVE。
-
你的代码在某处有
chroot调用吗? -
你确定
(args[1] == NULL)的结果是真的吗?尝试添加一些printf调用,或在调试器下运行程序,这样您就可以确定它正在做您认为它正在做的事情。或者暂时将if注释掉,以便它无条件地执行代码。chdir(getenv("HOME"))应该可以工作,但chdir(args[1])可能会也可能不会。 (我最好的猜测是args[1]不是空指针,而是指向一个空字符串。) -
BTW --
shell标签用于 in shell 命令语言编写的代码。如果您有一个非常非常特定于实现 shell 的问题,也许这也是使用该标签的一个很好的理由——但这里不是这种情况;你也可以合理地让这个问题实现许多其他类型的程序。 -
您是否尝试过使用
strace或sysdig来查看调用的实际系统调用(因此,究竟传递了chdir()的哪个参数)?您也可以使用 gdb 之类的调试器通过执行获得相同的信息跟踪。