Skip to content

bababuck/simple_shell

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

README

Simple shell capable of parsing basic command line prompts.

Loosely follow ideas from [https://www.cs.purdue.edu/homes/grr/SystemsProgrammingBook/Book/Chapter5-WritingYourOwnShell.pdf].

Support

This shell supports:

  • Calling other commands (e.g ls -a)
  • Chaining commands with pipes (e.g ls -a | grep "this")
  • Wildcard matching (e.g rm *.txt)
  • In/out file modification (e.g. >> outfile.txt)
  • Builtin commands (e.g. cd ..)
  • Running processes in background (e.g. ./a.exe &)

Sample output

personal@Ryans-MBP shell % ./parser.exe
/Users/personal/Documents/shell $ ls -a
.		.git		Makefile	command.c	lex.yy.c	parser.l	y.tab.c
..		.gitignore	README.md	command.h	parser.exe	parser.y	y.tab.h
/Users/personal/Documents/shell $ ls -a | grep comm >> matches.txt
/Users/personal/Documents/shell $ cat matches.txt
command.c
command.h
/Users/personal/Documents/shell $ touch a.txt
/Users/personal/Documents/shell $ ls
Makefile	a.txt		command.h	matches.txt	parser.l	y.tab.c
README.md	command.c	lex.yy.c	parser.exe	parser.y	y.tab.h
/Users/personal/Documents/shell $ rm *.txt
/Users/personal/Documents/shell $ ls
Makefile	README.md	command.c	command.h	lex.yy.c	parser.exe	parser.l	parser.y	y.tab.c		y.tab.h
/Users/personal/Documents/shell $ git add README.md
/Users/personal/Documents/shell $ git commit -m "Update README"
[main 535b113] Update README
 1 file changed, 23 insertions(+), 1 deletion(-)

Design

The system relies on yacc/lex for parsing the user input. This was likely overkill but was more fun to be able to define a language than to simply parse argument by argument.

Each line input is stored as a series of command_t objects, made up of one or more sub_command_t objects. Once a command has been parsed, it is passed to execute() which handles calls to fork() and modifying the file descriptors for stdout, stdin, and stderr as needed, including calls to pipe().

About

Just a simple shell using lex and yacc

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published