在C程序中更改Linux shell中的工作目录
我的目标是编写一个类似于Linux基本shell的C程序。我有一切工作,除了改变工作目录。我已经尝试了在C程序中更改Linux shell中的工作目录,c,linux,shell,directory,C,Linux,Shell,Directory,我的目标是编写一个类似于Linux基本shell的C程序。我有一切工作,除了改变工作目录。我已经尝试了system()来查找cd的输入字符串,但什么都没有发生。我还尝试了chdir(“标记字符串”),但也没有成功。有人有什么想法吗?这是我代码的一部分: fgets(cmdStr, sizeof(cmdStr), stdin); if( strncmp("quit", cmdStr, 4) == 0 || strncmp("Quit", cmdStr, 4) ==
system()
来查找cd
的输入字符串,但什么都没有发生。我还尝试了chdir(“标记字符串”)
,但也没有成功。有人有什么想法吗?这是我代码的一部分:
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);
}
}
有可能这样做吗?或者这是一个简单的例子,与儿童外壳不能做某些事情有关
编辑:以上代码已完成。您的
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>
char*ptr=cmdStr;
else if(strncmp(“cd”,cmdStr,2)==0)
{
STREP(&ptr,“”)/*跳过“cd”*/
char*chr=strep(&ptr,“\n”);/*跳过“\n”*/
errno=0;
chdir(chr);
如果(错误号!=0)
printf(“更改目录时出错:%s\n”,strerror(errno));
}
您的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>
char*ptr=cmdStr;
else if(strncmp(“cd”,cmdStr,2)==0)
{
STREP(&ptr,“”)/*跳过“cd”*/
char*chr=strep(&ptr,“\n”);/*跳过“\n”*/
errno=0;
chdir(chr);
如果(错误号!=0)
printf(“更改目录时出错:%s\n”,strerror(errno));
}
fgets()
在cmdstr
中保留尾部的'\n'
字符
如果键入cd foo
,您将调用chdir(“foo\n”)
,而不是chdir(“foo”)
fgets()
在cmdstr
中保留尾随的'\n'
字符
如果键入
cd foo
,您将调用chdir(“foo\n”)
,而不是chdir(“foo”)
chdir
是否正确。它的返回值是多少?如果-1,什么是错误号?(始终检查系统调用的返回值。)@Nemo无论字符串是什么,返回值都是-1。使用不同的字符串尝试了多次。不确定如何检查它与-1一起产生的错误。有什么建议吗?我只想指出,您使用strncmp
的方式意味着cdxxx foo
相当于cd foo
。要获得更一般的功能,请首先将字符串解析为标记,然后检查第一个标记是否为“cd”
。(这个问题已经有5年了,所以这可能不相关,但未来的读者可能会感兴趣。)chdir
是正确的。它的返回值是多少?如果-1,什么是错误号?(始终检查系统调用的返回值。)@Nemo无论字符串是什么,返回值都是-1。使用不同的字符串尝试了多次。不确定如何检查它与-1一起产生的错误。有什么建议吗?我只想指出,您使用strncmp
的方式意味着cdxxx foo
相当于cd foo
。要获得更一般的功能,请首先将字符串解析为标记,然后检查第一个标记是否为“cd”
。(这个问题已经5年了,所以这可能不相关,但未来的读者可能会感兴趣。)错误更改目录:未知错误18446744073709551615不确定这意味着什么,谷歌也没有帮助…做了一些改变,现在我得到了这个:错误更改目录:没有这样的文件或目录现在我们有进展了。确保从您的pwd
,您尝试cd
的目录是可行的。尝试提供绝对路径。如果在程序运行时我在程序中键入目录名,我会得到以下信息:/home sh:/home:是一个目录,但键入cd/home除了产生错误外,什么都不会做。嗯。也尝试了绝对路径。错误更改目录:未知错误18446744073709551615不确定这意味着什么,谷歌也没有帮助…做了一些改变,现在我得到了这个:错误更改目录:没有这样的文件或目录现在我们正在某处。确保从您的pwd
,您尝试cd
的目录是可行的。尝试提供绝对路径。如果在程序运行时我在程序中键入目录名,我会得到以下信息:/home sh:/home:是一个目录,但键入cd/home除了产生错误外,什么都不会做。嗯。还尝试了绝对路径。