/* minish.c - example of a minimalistic shell * Comments in code deliberately omitted. :-) */ #include #include #include #include #include #include #define MAXLINE 30 int main(int argc, char **argv) { char line[MAXLINE+1], *args[MAXLINE], *p, **arg; if (argc>=2 && !freopen(argv[1], "r", stdin)) { perror(argv[1]); exit(errno); } while (fgets(line, MAXLINE, stdin)) { if ((p = strchr(line, '\n'))) { *p=0; } else { fprintf(stderr, "line too long\n"); exit(1); } p = line; while (*p == ' ') ++p; if (*p == '#') continue; *(arg=args) = p; while ((p = strchr(p, ' '))) { while (*p == ' ') *p++ = 0; if (*p) *++arg=p; } *++arg=NULL; if (!strcmp(line,"exit")) { exit(args[1] ? atoi(args[1]) : 0); } switch (fork()) { case 0: execvp(args[0], args); perror(args[0]); exit(errno); case -1: perror("fork() failed"); break; default: wait(NULL); } } exit(0); }