Skip to content
Holberton Curriculum for making a simple shell.
C Shell
Branch: master
Clone or download
Rmolimock Merge pull request #31 from kai-dg/russell_branch
exit if directory can't be opened, not return
Latest commit d9cfee3 Nov 20, 2018

0x15. C - Simple Shell


In this project we are tasked with creating our own simple UNIX command interpreter. The program must have the exact same output as sh (/bin/sh) as well as the exact same error output. The only difference is when you print an error, the name of the program must be equivalent to your argv[0].


  • Compiling the program: gcc -Wall -Werror -Wextra -pedantic *.c -o hsh

  • Interactive mode:

$ ./hsh
($) /bin/ls
hsh main.c shell.c
($) exit
  • Non-interactie mode:
$ echo "/bin/ls" | ./hsh
hsh main.c shell.c test_ls_2
$ cat test_ls_2
$ cat test_ls_2 | ./hsh
hsh main.c shell.c test_ls_2
hsh main.c shell.c test_ls_2




File Description
main.c entry point for shell
shell.c executes the shell
shell.h header
builtins.c built-in functions
helpers.c helper functions
extraneous.c more helper functions
_getenv.c gets inputted env
search_cwd.c gets current working dir
find_path.c finds PATH
bridge.c checks if builtin or not
execute.c executes builtin or binary
man_1_simple_shell man page

Project Requirements

  • All your files will be compiled on Ubuntu 14.04 LTS
  • Your C programs and functions will be compiled with gcc 4.8.4 using the flags -Wall -Werror -Wextra and -pedantic
  • All your files should end with a new line
  • A file, at the root of the folder of the project is mandatory
  • Your code should use the Betty style. It will be checked using and
  • No more than 5 functions per file
  • All your header files should be include guarded
  • Use system calls only when you need to



  • Write a (README)[./]
  • Write a (man)[./man_1_simple_shell] for your shell.
  • You should have an (AUTHORS)[./AUTHORS] file at the root of your repository, listing all individuals having contributed content to the repository.

1. Betty would be proud

  • Write a beautiful code that passes the Betty checks

2. Simple shell 0.1

  • Write a UNIX command line interpreter.
  • Your Shell should:
    • Display a prompt and wait for the user to type a command. A command line always ends with a new line.
    • The prompt is displayed again each time a command has been executed.
    • The command lines are simple, no semicolons, no pipes, no redirections or any other advanced features.
    • The command lines are made only of one word. No arguments will be passed to programs.
    • If an executable cannot be found, print an error message and display the prompt again.
    • Handle errors.
    • You have to handle the "end of file" condition (Ctrl+D)

3. Simple shell 0.2

  • Handle command lines with arguments

4. Simple shell 0.3

  • Handle the PATH

5. Simple shell 0.4

  • Implement the exit built-in, that exits the shell
  • Usage: exit
  • You dont have to handle any argument to the built-in exit

6. Simple shell 1.0

  • Implement the env built-in, that prints the current environment

7. What happens when you type ls -l in the shell


You can’t perform that action at this time.