How can I implement my own basic unix shell in C?
Solution 1
All the unix shells are open-source - so a good place to start may be to read the code.
If you're looking for a good starter article on the subject try Writing Your Own Shell from the Linux Gazette.
Another good starting point is to take a look at the source code of mini-shell just because its one of the smallest to get your head round.
Solution 2
Your main loop is:
- read a line (use
fgets(3)
for a simple shell,readline(3)
for a fancy one) - parse the command
- fork and execute the pipelines
To parse the command, there are two common choices. Write a recursive descent parser or use yacc(1)
to generate one. It's a lot easier to bang out an initial parser using yacc
, but you can totally get stuck debugging it and it really wants to be context-free. I prefer recursive descent but just about everyone else in the world prefers using yacc. (Technically, bison
.) If the shell is really really simple, like a homework shell, yacc may be overkill.
To do the lexical analysis you can also roll your own or use flex.
You won't need to use any threads.
Solution 3
Many of the Unix books that describe the main system calls also implement a shell to illustrate how and why you might use the various calls. Stevens and Rochkind are two such books:
W Richard Stevens, Stephen A Rago Advanced Programming in the Unix Environment, 3rd Edn
Marc J Rochkind Advanced Unix Programming, 2nd Edn
Related videos on Youtube
Comments
-
Alex Xander almost 2 years
I'm a newbie to process and thread management. My Shell should understand
PATH
environment variable. It can be set and modified. It runs in two ways -interactive & batch mode. Shell is capable of taking more than one job like ls;ps;wc file;cal. I want to get my hands dirty on signals too. So I should handle ^K , ^c as well.I know I will have to use execs, forks and pipes but just can't get started.
-
Amok over 14 yearsIs this a homework question? If so you should tag it appropriately.
-
-
visual_learner over 14 yearsI would recommend
readline()
be used in any case - it will make your life infinitely easier as long as you have to use said shell. But +1 for getting bogged down in yacc/bison. Good tools, but it's a hard task to simplify. -
aviraldg over 14 yearsIf you just want to execute programs from yoyur shell, then you don't need a parser & lexer ... however if you do want to do "other" things then I suggest you to use flex+yacc ... do not roll your own
-
Alex Xander over 14 yearsAm getting it. But I want to get my hands dirty on signals too. So I should handle ^K , ^c as well.