【问题标题】:Changing working directories in Linux shell in a C program在 C 程序中更改 Linux shell 中的工作目录
【发布时间】:2011-10-18 17:27:51
【问题描述】:

我的目标是编写一个类似于 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);
        }
    }

可以这样做吗?或者这是与子外壳无法执行某些操作有关的简单案例?

编辑:上面的代码是完整的。

【问题讨论】:

  • chdir 是正确的。它的返回值是多少?如果-1,什么是errno? (始终检查系统调用的返回值。)
  • @Nemo 无论字符串是什么,返回值都是-1。用不同的字符串尝试了多次。不确定如何检查它与 -1 一起产生的错误。有什么建议吗?
  • 我会注意到你使用strncmp的方式意味着cdxxx foo等同于cd foo。对于更通用的功能,首先将字符串解析为标记,然后检查第一个标记是否为"cd"。 (这个问题是 5 年前的问题,所以这可能不相关,但未来的读者可能会感兴趣。)

标签: c linux shell directory


【解决方案1】:

您的chdir 调用失败,返回值-1

请尝试像这样打印errno

errno = 0;
chdir(token);
if ( errno != 0 ) {
    printf( "Error changing dir: %s\n", strerror( errno ) );
}

Keith 是正确的:\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>

【讨论】:

  • 更改目录时出错:未知错误 18446744073709551615 不确定这意味着什么,谷歌没有帮助...
  • 做了一些改变,现在我得到了这个:更改目录时出错:没有这样的文件或目录
  • 现在我们正在取得进展。确保从您的pwd,您尝试cd 的目录是可行的。
  • 尝试提供absolute 路径。
  • 如果我在程序运行时将目录名称输入到程序中,我会得到: /home sh: /home: 是一个目录,但输入 cd /home 不会执行任何操作,只会产生错误。嗯。还尝试了绝对路径。
【解决方案2】:

fgets()cmdstr 中留下尾随的'\n' 字符。

如果您输入cd foo,您将调用chdir("foo\n") 而不是chdir("foo")

【讨论】:

    猜你喜欢
    • 2014-03-02
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 2017-03-14
    • 2011-04-16
    • 2011-03-29
    相关资源
    最近更新 更多