Skip to content

tanyastropheus/simple_shell

Repository files navigation

Shell Seahorse

Title

0x15. C - Simple Shell

Authors

Description

Write a simple UNIX command interpreter.

Objectives

  • Understand the following concepts:
    • How does a shell work
    • What is a pid and a ppid
    • How to manipulate the environment of the current process
    • What is the difference between a function and a system call
    • How to create processes
    • What are the three prototypes of main
    • How does the shell use the PATH to find the programs
    • How to execute another program with the execve system call
    • How to suspend the execution of a process until one of its children terminates
    • What is EOF

Output

  • Unless specified otherwise, your 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] (See below)
  • Example of error with sh:

    $ echo "qwerty" | /bin/sh
    /bin/sh: 1: qwerty: not found
    $ echo "qwerty" | /bin/../bin/sh
    /bin/../bin/sh: 1: qwerty: not found
    $
    

    Same error with your program hsh:

    $ echo "qwerty" | ./hsh
    ./hsh: 1: qwerty: not found
    $ echo "qwerty" | ./././hsh
    ./././hsh: 1: qwerty: not found
    $
    
    

    Allowed functions

    • access (man 2 access)
    • chdir (man 2 chdir)</li>
    • close (man 2 close)
    • closedir (man 3 closedir)
    • execve (man 2 execve)
    • exit (man 3 exit)
    • fork (man 2 fork)
    • free (man 3 free)
    • stat (__xstat) that(man 2 stat)
    • lstat (__lxstat) (man 2 lstat)
    • fstat (__fxstat) (man 2 fstat)
    • getcwd (man 3 getcwd)
    • getline (man 3 getline)
    • kill (man 2 kill)
    • malloc (man 3 malloc)
    • open (man 2 open)
    • opendir (man 3 opendir)
    • perror (man 3 perror)
    • read (man 2 read)
    • readdir (man 3 readdir)
    • signal (man 2 signal)
    • strtok (man 3 strtok)
    • wait (man 2 wait)
    • waitpid (man 2 waitpid)
    • wait3 (man 2 wait3)
    • wait4 (man 2 wait4)
    • write (man 2 write)
    • _exit (man 2 _exit)
    • isatty (man 3 isatty)
    • fflush (man 3 fflush)

    Installation

    • Clone the repository into your terminal

    Compilation

    Your shell will be compiled this way: gcc -Wall -Werror -Wextra -pedantic *.c -o hsh

    Requirements

    * Allowed editors: `vi`, `vim`, `emacs`
    * All your files should be compiled on Ubuntu 14.04 LTS
    * Your C programs and functions should 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 `README.md` file, at the root of the folder of the project is mandatory
    * Your code should use the `Betty` style. It will be checked using <a href="https://github.com/holbertonschool/Betty/blob/master/betty-style.pl">betty-style.pl</a> and <a href="https://github.com/holbertonschool/Betty/blob/master/betty-doc.pl">betty-doc.pl</a>
    * No more than 5 functions per file
    * All your header files should be include guarded
    

    Tasks

    Mandatory 0

    1. README, man, AUTHORS
      • Write a README
      • Write a man for your shell
      • You should have an AUTHORS file at the root of your repository, listing all individuals having contributed content to the repository. Format, see Docker

    Mandatory 1

    1. Betty would be proud
      • Write a beautiful code that passes the Betty checks

    Mandatory 2

    1. Simple shell 0.1
    • Write a UNIX command line interpreter.
      • Usage: simple_shell
    • 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 semi-columns, 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). Exit with code 0
    • You don't have to:
      • Use the PATH
      • Implement built-ins
      • Handle the special characters: ", ', `, \, *, &, #
      • Be able to move the cursor
      • Handle commands with arguments

    Mandatory 3

    1. Simple shell 0.2
    • Simple shell 0.1 +
      • Handle command lines with arguments

    Mandatory 4

    1. Simple shell 0.3
    • Simple shell 0.2 +
      • Handle the PATH

    Mandatory 5

    1. Simple shell 0.4
    • Simple shell 0.3 +
      • Implement the exit built-in, that exits the shell
      • Usage: exit
      • You don't have to handle any argument to the built-in exit

    Mandatory 6

    1. Simple shell 1.0
    • Simple shell 0.4 +
      • Implement the env built-in, that prints the current environment

    Mandatory 7

    1. What happens when you type ls -l in the shell
    • Write a blog post describing step by step what happens when you type ls -l and hit Enter in a shell. Try to explain every step you know of, going in as much details as you can, give examples and draw diagrams when needed. You should merge your previous knowledge of the shell with the specifics of how it works under the hoods (including syscalls).
      • Have at least one picture, at the top of the blog post
      • Public your blog post on Medium or LinkedIn
      • Share your blog post at least on Twitter and LinkedIni

    About

    A Thompson shell to study Linux internals and low-level programming

    Resources

    Stars

    Watchers

    Forks

    Releases

    No releases published

    Packages

     
     
     

    Contributors