我的目标是编写一个类似于Linux的基本shell的C程序。除了更改工作目录外,我一切正常。我已经为system()
尝试了cd
输入字符串,但没有发生任何事情。我也试过chdir("tokened string")
但也没有运气。有人有主意吗?这是我的代码的一部分:
fgets(cmdStr, sizeof(cmdStr), stdin);
if( strncmp("quit", cmdStr, 4) == 0 || strncmp("Quit", cmdStr, 4) == 0 )
{
break;
}
else if( strncmp("cd", cmdStr, 2) == 0 )
{
char *token = strtok(cmdStr, " ");
token = strtok(NULL, " ");
chdir(token);
}
else
{
system(cmdStr);
}
}
有可能这样做吗?或者这是一个与子shell无法做某些事情有关的简单案例?
编辑:上面的代码已经完成。
答案 0 :(得分:5)
fgets()
在'\n'
中留下尾随的cmdstr
字符。
如果您输入cd foo
,则会拨打chdir("foo\n")
而不是chdir("foo")
。
答案 1 :(得分:2)
chdir
来电失败,-1
返回值。
请尝试打印errno
,如下所示:
errno = 0;
chdir(token);
if ( errno != 0 ) {
printf( "Error changing dir: %s\n", strerror( errno ) );
}
基思是正确的:\n
最终会杀了你。
你可以做以下事情来摆脱它:
char *ptr = cmdStr;
<snip>
else if( strncmp("cd", cmdStr, 2) == 0 )
{
strsep(&ptr, " "); /* skip "cd" */
char *chr = strsep(&ptr, "\n"); /* skip "\n" */
errno = 0;
chdir(chr);
if ( errno != 0 )
printf( "Error changing dir: %s\n", strerror( errno ) );
}
</snip>