这真的取决于你的外壳必须有多简单。如果您不需要作业控制(即后台处理)或管道,那么它非常简单。这是一个例子:
#include <stdio.h>
#include <stdlib.h>
#define MAX_LENGTH 1024
int main(int argc, char *argv[]) {
char line[MAX_LENGTH];
while (1) {
printf("$ ");
if (!fgets(line, MAX_LENGTH, stdin)) break;
system(line);
}
return 0;
}
您可以使用 CTRL-D 退出上述示例。要添加像 exit 或 cd 这样的内置命令,您必须使用 strtok() 标记该行并查看第一个标记。这是一个添加了这些命令的更复杂的示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#ifdef _WIN32
#include <windows.h>
#define chdir _chdir
#else
#include <unistd.h>
#endif
#define MAX_LENGTH 1024
#define DELIMS " \t\r\n"
int main(int argc, char *argv[]) {
char *cmd;
char line[MAX_LENGTH];
while (1) {
printf("$ ");
if (!fgets(line, MAX_LENGTH, stdin)) break;
// Parse and execute command
if ((cmd = strtok(line, DELIMS))) {
// Clear errors
errno = 0;
if (strcmp(cmd, "cd") == 0) {
char *arg = strtok(0, DELIMS);
if (!arg) fprintf(stderr, "cd missing argument.\n");
else chdir(arg);
} else if (strcmp(cmd, "exit") == 0) {
break;
} else system(line);
if (errno) perror("Command failed");
}
}
return 0;
}
您可以通过添加更多内置命令或支持诸如 cd 之类的内容来扩展此功能,无需参数即可更改为您的主目录。您还可以通过添加当前目录等信息来改进命令提示符。
附带说明一下,添加命令历史记录和行编辑功能的简单方法是使用 GNU readline 库。