shell 的 C 输入循环

发布于 2024-10-11 03:22:34 字数 342 浏览 2 评论 0原文

所以我正在创建一个非常简单的 C 程序,它只执行 shell 命令。这就是我到目前为止所拥有的:

#include <stdio.h>
int main()
{
char input[30];
fputs("$ ", stdout);
fflush(stdout);
fgets(input, sizeof input, stdin);
system(input);
}

它有效,但仅适用于一个命令。例如,如果我编译并输入 ./cmd 我会得到 $ 提示符。如果我输入 ls 我会得到我应该得到的东西。但随后它会退出并返回到常规系统 shell。我怎样才能让用户输入命令后返回到“$”输入。

So I'm working on creating a very simple C program that just preforms shell commands. This is what I have so far:

#include <stdio.h>
int main()
{
char input[30];
fputs("$ ", stdout);
fflush(stdout);
fgets(input, sizeof input, stdin);
system(input);
}

It works, but only for one command. For example if I compile and type ./cmd I get the $ prompt. If I type ls I get what I'm supposed to get. But then it exits and goes back to the regular system shell. How can I make it so after the user types a command it goes back to the "$" input.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

暗藏城府 2024-10-18 03:22:34

您正在寻找的是循环;如果你想让退出条件由用户输入确定,实际上你可能需要一个无限循环(惯用的方式是for(;;))和一个if 在输入采集之后,如果满足您的条件,则会导致中断

#include <stdio.h>

int main()
{
    char input[30];
    for(;;) /* infinite loop */
    {
        fputs("$ ", stdout);
        fflush(stdout);
        fgets(input, sizeof input, stdin);
        if(/* put here your exit condition */)
            break; /* breaks out of the loop */
        system(input);
    }
    return 0;
}

您的退出条件可能涉及使用 strcmp (来自 )来执行用户输入的字符串与退出命令之间的比较。

What you're looking for are loops; if you want to have the exit condition determined by the user input, actually you probably need to have an infinite loop (the idiomatic way is for(;;)) and an if after the input acquisition that results in a break if your condition is satisfied.

#include <stdio.h>

int main()
{
    char input[30];
    for(;;) /* infinite loop */
    {
        fputs("$ ", stdout);
        fflush(stdout);
        fgets(input, sizeof input, stdin);
        if(/* put here your exit condition */)
            break; /* breaks out of the loop */
        system(input);
    }
    return 0;
}

Your exit condition will probably involve using strcmp (from <string.h>) to perform the comparison between the string entered by the user and your exit command.

┊风居住的梦幻卍 2024-10-18 03:22:34

您需要将代码放在循环内。例如:

int main()
{
    while (1) {
        char input[30];
        fputs("$ ", stdout);    
        fflush(stdout);
        fgets(input, sizeof input, stdin);
        system(input);
    }
}

while (1) { ... } 是一个无限循环。退出的唯一方法是以某种方式终止你的程序。为了能够使用命令退出循环,您需要在其中添加某种条件:

    while (1) {
        char input[30];
        fputs("$ ", stdout);    
        fflush(stdout);
        fgets(input, sizeof input, stdin);
        if (strcmp(input, "exit") == 0) {
            break;
        }
        system(input);
    }

strcmp() 进行比较以查看您是否键入了“exit”。如果是这样,那么 break 语句将退出最近的循环,并且程序结束。

You need to place your code inside a loop. For example:

int main()
{
    while (1) {
        char input[30];
        fputs("$ ", stdout);    
        fflush(stdout);
        fgets(input, sizeof input, stdin);
        system(input);
    }
}

The while (1) { ... } is an infinite loop. The only way to exit this would be to kill your program in some way. To be able to exit the loop with a command, you'll need to put some kind of condition inside it:

    while (1) {
        char input[30];
        fputs("$ ", stdout);    
        fflush(stdout);
        fgets(input, sizeof input, stdin);
        if (strcmp(input, "exit") == 0) {
            break;
        }
        system(input);
    }

The strcmp() does a compare to see if you typed "exit". If so, then the break statement exits the nearest loop, and your program ends.

春庭雪 2024-10-18 03:22:34

您不需要任何循环,您需要一个 do while 循环,因为您总是希望至少执行一次 system() 命令。此外,通过将关键字 exit 作为中断条件,在调用 system() 之前不需要额外的代码来检查 input,因为如果您使用 strcmp() 作为 do-while 条件语句,exit 将终止您的 shell 和程序。

#include <stdio.h>
#include <string.h>

int main(void)
{
  char input[30];
  do {
    fputs("$ ", stdout);
    fflush(stdout);
    fgets(input, sizeof input, stdin);
    system(input);
  } while(strcmp(input,"exit\n"));

  return 0;
}

输出

[siegex@localhost]$ ./myshell
$ echo foo
foo
$ echo bar | sed 's/r/z/'
baz
$ exit
[siegex@localhost]$

You don't want just any loop, you want a do while loop because you always want to perform the system() command at least once. Also, by having the keyword exit be your break condition, there is no need for extra code to check input before you call system() because exit will kill both your shell and your program if you use strcmp() as the do-while conditional statement.

#include <stdio.h>
#include <string.h>

int main(void)
{
  char input[30];
  do {
    fputs("$ ", stdout);
    fflush(stdout);
    fgets(input, sizeof input, stdin);
    system(input);
  } while(strcmp(input,"exit\n"));

  return 0;
}

Output

[siegex@localhost]$ ./myshell
$ echo foo
foo
$ echo bar | sed 's/r/z/'
baz
$ exit
[siegex@localhost]$
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文