在C程序中更改Linux shell中的工作目录

时间:2011-08-03 00:48:14

标签: c linux shell directory

我的目标是编写一个类似于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无法做某些事情有关的简单案例?

编辑:上面的代码已经完成。

2 个答案:

答案 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>
相关问题