No, the shell does not analyze it for you. Each program should analyze it independently. The following code should make it clear what is going on.
#include <stdio.h> int main(int argc, char **argv) { int i; printf("argc: %d\n", argc); for (i = 0; i < argc; i++) { printf("argv[%d] = %s\n", i, argv[i]); } return 0; }
Compile this program.
susam@nifty :~$ gcc args.c -o args
Now let's run this and see the output:
.susam@nifty :~$ ./args argc: 1 argv[0] = ./args susam@nifty :~$ ./args foo bar argc: 3 argv[0] = ./args argv[1] = foo argv[2] = bar susam@nifty :~$ ./args -a foo --b bar argc: 5 argv[0] = ./args argv[1] = -a argv[2] = foo argv[3] = --b argv[4] = bar
The only thing the shell does is pass each argument you specify on the command line to your program. Although it would pass foo bar as two separate arguments to your program, it would pass "foo bar" or 'foo bar ' as one argument to your program. Yes, so the shell does some sort of parsing of the arguments before passing it to your program. It treats quoted strings as one argument. Here is a demo:
susam@nifty :~$ ./args -a foo bar argc: 4 argv[0] = ./args argv[1] = -a argv[2] = foo argv[3] = bar susam@nifty :~$ ./args -a "foo bar" argc: 3 argv[0] = ./args argv[1] = -a argv[2] = foo bar susam@nifty :~$ ./args -a 'foo bar' argc: 3 argv[0] = ./args argv[1] = -a argv[2] = foo bar susam@nifty :~$ ./args -a "foo bar" 'car tar war' argc: 4 argv[0] = ./args argv[1] = -a argv[2] = foo bar argv[3] = car tar war
source share