-
Notifications
You must be signed in to change notification settings - Fork 0
/
minishell.c
55 lines (50 loc) · 1.3 KB
/
minishell.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// /minishell.c/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char commandline[100], **argv;
int i, j, k, n;
while (1) {
printf("> "); // Prompt for a command
j=0;
i=0;
k=0;
gets(commandline); // Read command line
if (!strcmp(commandline, "exit")) break;
// Calculate the number of command line arguments
while (commandline[i] != '\0') {
while(commandline[i] == ' ') i++;
i++;
if (commandline[i] == ' ') { j++; i++; }
}
// Allocate argument list array (one plus the needed number)
argv = (char**)malloc((j+2)*sizeof(char*));
for (n=0; n<j+1; n++) {
argv[n] = (char*)malloc(20*sizeof(char));
}
argv[j+1] = NULL; // The last argument is null
// Copy command line to argument list
j=0;
i=0;
k=0;
while (commandline[i] != '\0') {
while(commandline[i] == ' ') i++;
argv[j][k] = commandline[i];
k++;
i++;
if (commandline[i] == ' ') {
argv[j][k] = '\0';
j++;
k=0;
i++;
}
}
argv[j][k] = '\0';
// Fork child to execute command
if (fork()==0) execv(argv[0],argv);
else wait(NULL);
}
return 0;
}