【问题标题】:ls command does not work in the Program written in C(shell script)ls 命令在用 C(shell 脚本)编写的程序中不起作用
【发布时间】:2023-04-29 05:13:02
【问题描述】:
void main() {
    char *args[MAX_LINE];
    char arg1[MAX_LINE/2] = "\0";
    char arg2[MAX_LINE/2] = "\0";
    printf("ubos>");
    fflush(stdout);
    fgets(arg1, sizeof(arg1), stdin);
    arg1[strlen(arg1) - 1] = '\0';
    fgets(arg2, sizeof(arg2), stdin);
    arg2[strlen(arg2) - 1] = '\0';

  abc:  
    printf("You typed: %s %s\n", arg1, arg2);
    fflush(stdin);
    args[0] = arg1;
    args[1] = arg2;
    args[2] = '\0'; 

    int i = 0;
    for (i = 0; i < MAX; i++) {
        printf("Vlue of arg[%d] =%s\n", i, args[i]);
    }

    if (strcmp(args[0], "ls") == 0) {
        execvp(args[0], args);
        goto abc;
    } else
    if (strcmp(args[0], "ps") == 0) {

    }

    printf("Something is not correct...\n");
    exit(0);
}

当我使用ls 命令运行此代码时,结果如下。我不知道这段代码有什么问题。当我运行此代码以执行另一个 .c 文件时,它可以完美执行,但是当我尝试使用 lsps 命令时,它不允许我使用它并引发错误。

我还有一个问题,为什么这个goto 在这个程序中不起作用。

ubos>ls

You typed: ls 
Vlue of arg[0] =ls
Vlue of arg[1] =
Vlue of arg[2] =(null)
ls: cannot access : No such file or directory

所以这是我的错误,你能给我一些关于如何使用 exec 命令及其不同类型的建议吗?

【问题讨论】:

  • 这个输出是不是给你一个线索:Vlue of arg[1] =?您正在向ls 提供一个空字符串作为参数。也就是说,您正在运行ls ''。手动运行该命令,您将看到相同的结果。您不应该对两个参数进行硬编码。
  • 如果我想执行两个单词参数怎么办。我还想执行一些 .c 文件。所以这就是为什么有两个论点。
  • 但这不是你要测试的。 ubos&gt;lsls 命令没有参数。所以你的 shell 需要处理零个参数(一个词)。而且你不能仅仅通过盲目地将第二个 arg 设置为空字符串 (args[1]=arg2;) 来做到这一点。
  • 你能给我一些代码吗,我可以在这里做些什么来传递两个参数或一个参数。
  • 我已经指出了问题所在。现在不如你自己先试一试,而不是仅仅要求代码?

标签: c linux shell


【解决方案1】:

如果他们不提供参数,请将 args 中的参数设置为 0。那么ls 将不会接收一个空字符串作为它的第一个参数,它根本不会得到任何参数。

args[0] = arg1;
if (strlen(arg2) == 0) {
    args[1] = 0;
} else {
    args[1] = arg2;
    args[2] = 0;
}

您还需要在打印所有参数的循环中检查这一点。

for(i=0;i<MAX && arg[i];i++)
{
    printf("Value of arg[%d] =%s\n",i, args[i]);
}

【讨论】:

  • 当我输入 ls 作为参数时,它显示了分段错误
  • 打印每个参数值的循环需要在结束时停止。
  • 谢谢。 if (strlen(arg2) == '\0') { args[0] = arg1; args[1] = '\0'; } 其他 { args[0] = arg1;参数 [1] = 参数 2;参数 [2] = 0; }
  • '\0' 是数字或指针而不是字符时,为什么要使用0
  • '\0' 是一个空字符。当您需要整数或指针时,通常不使用它。
【解决方案2】:
if (strlen(arg2) == '\0')
    {
         args[0] = arg1;
         args[1] = '\0';
    } 
    else 
    {
        args[0] = arg1;
            args[1] = arg2;
            args[2] = 0;
    }
for(i=0;i<MAX && args[i];i++)
    {
            printf("Vlue of args[%d] =%s\n",i, args[i]);
    }

我将空格作为第二个参数传递。所以它向我展示了错误。上面的代码是我的问题的解决方案..

【讨论】: