Skip to content

BekiHabesha/simple_shell

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

47 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

README.md File

0x16.C-Simple Shell README.md File

My alx.

This is a team project on 0x16. C - Simple Shell

  • Done by:
    • Bereket Dereje Mekonnen

Beki_Shell.

  • File_name:
    • README.md file
  • Created:
    • On November 3, 2023
  • Author:
    • Bereket Dereje Mekonnen,
  • Project:
    • 0x16. C - Simple Shell
  • GitHub repository:
    • simple_shell
  • Directory:
    • simple_shell
  • Project Tasks:
    • Mandatory and Advanced
  • Tasks in number:
    • 17 Tasks (6-Mandatory & 11-Advanced)
  • Mandatory_Tasks:
    • From Task 0 to 5
  • Advanced_Tasks:
    • From Task 6 to 16

Beki_Shell.

PROJECT_TITLE:

0x16.C-Simple Shell

GITHUB_REPOSITORY:

simple_shell

Background Context

  • Write a simple UNIX command interpreter. Write a simple UNIX command interpreter.

My Simple Shell Files

Table of My Simple Shell Project Files

My Simple Shell Project Files
NO. File Name NO. File Name NO. File Name
1 README.md 12 char_err.c 23 sep_list.c
2 shell.h 13 synt_err.c 24 line_list.c
3 shell.c 14 env.c 25 rvar_list.c
4 _getbuiltin.c 15 environ.c 26 readline.c
5 _geterror.c 16 err.c 27 memo.c
6 _gethelp.c 17 error.c 28 var.c
7 _getline.c 18 exec.c 29 comm.c
8 _getsigint.c 19 exit_shell.c 30 conv.c
9 exec_line.c 20 help_env.c 31 _strcc.c
10 cd_shell.c 21 help_gen.c 32 _strdlt.c
11 cddir.c 22 shell_loop.c 33 hsh

Beki_Shell.

Exercise Files
NO. File Name NO. File Name NO. File Name
1 _getenv.c 17 fork0.c 33 shell.c
2 add.c 18 fork0_0.c 34 shell_0.3.c
3 add1.c 19 fork0_1.c 35 stat.c
4 add2.c 20 fork_1.c 36 strtok.c
5 env-main.c 21 fork_my_fork.c 37 strtok1.c
6 env_vs_environ.c 22 fork_my_fork1.c 38 strtok2.c
7 environ.c 23 fork_my_fork2.c 39 strtok3_without_strtok.c
8 exec.c 24 fwe.c 40 strtok_1.c
9 exec0.c 25 getenv.c 41 strtok_2.c
10 exec1.c 26 no_argc.c 42 subtract.c
11 exec2.c 27 path.c 43 sum.c
12 f_w_e.c 28 pid.c 44 sum1.c
13 f_w_e1.c 29 ppid.c 45 sum2.c
14 f_w_e2.c 30 prompt.c 46 sum3.c
15 find_file.c 31 prompt0.c 47 wait.c
16 fork.c 32 prompt1.c 48 wait0.c

Beki_Shell.

Learning Objectives

Learning Objectives

  • At the end of this project,
    • You are expected to be able to explain to anyone,
      • Without the help of Google:

General Learning Objectives

General Learning Objectives

  • Who designed and implemented the original Unix operating system
  • Who wrote the first version of the UNIX shell
  • Who invented the B programming language
    • (the direct predecessor to the C programming language)
  • Who is Ken Thompson
  • 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 / “end-of-file”?

Beki_Shell.

Copyright - Plagiarism

  • You are tasked to come up with solutions for the tasks yourself
    • To meet with the above learning objectives.
  • You will not be able to meet the objectives of this or any following project
    • By copying and pasting someone else’s work.
  • You are not allowed to publish any content of this project.
  • Any form of plagiarism is strictly forbidden
    • And will result in removal from the program.

Requirements

General Requirements

  • Allowed editors: vi, vim, emacs
  • All your files will be compiled on Ubuntu 20.04 LTS using gcc,
    • using the options -Wall -Werror -Wextra -pedantic -std=gnu89
  • 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 betty-style.pl and betty-doc.pl
  • Your shell should not have any memory leaks
  • No more than 5 functions per file
  • All your header files should be include guarded
  • Use system calls only when you need to (why?)
  • Write a README with the description of your project
  • You should have an AUTHORS file at the root of your repository,
    • listing all individuals
      • having contributed content to the repository.
        • Format, see Docker

Beki_Shell.

GitHub Requirements

  • There should be one project repository per group.
    • If you and your partner have a repository with the same name in both your accounts,
      • you risk a 0% score.
    • Add your partner as a collaborator.

PROJECT_TITLE:

0x16. C - Simple Shell

GITHUB_REPOSITORY:

simple_shell

  • File_name: README.md file
  • Created: On November 3, 2023
  • Authors:
    • Bereket Dereje Mekonnen
  • Project: 0x16. C - Simple Shell
  • GitHub repository: simple_shell
  • Directory: simple_shell
  • Project Tasks: Mandatory and Advanced
  • Tasks in number: 17 Tasks (6->Mandatory & 4->Advanced)
  • Mandatory_Tasks: From Task 0 to 5
  • Advanced_Tasks: From Task 6 to 16

Write a simple UNIX command interpreter.

PROJECT TASKS (Mandatory and Advanced)

MANDATORY_TASKS (From Task 0 to 5)

No. 0. Betty would be proud

  • Write a beautiful code that passes the Betty checks.

No. 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 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) Beki.

  • You don’t have to:
    • use the PATH

    • implement built-ins

    • handle special characters : ", ', `, , *, &, #

    • be able to move the cursor

    • handle commands with arguments

      • From My Simple Shell Output Beki_Shell.

No. 2. Simple shell 0.2

  • Simple shell 0.1 +
    • Handle command lines with arguments

No. 3. Simple shell 0.3

  • Simple shell 0.2 +
    • Handle the PATH
    • fork must not be called if the command doesn’t exist Beki.
      • From My Simple Shell Output Beki_Shell.

No. 4. 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

No. 5. Simple shell 1.0

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

      • From My Simple Shell Output Beki_Shell.

ADVANCED_TASKS (From Task 6 to 16)

No. 6. Simple shell 0.1.1

  • Simple shell 0.1 +
    • Write your own getline function
    • Use a buffer to read many chars at once and call the least possible the read system call
    • You will need to use static variables
    • You are not allowed to use getline

  • You don’t have to:
    • be able to move the cursor

No. 7. Simple shell 0.2.1

  • Simple shell 0.2 +
    • You are not allowed to use strtok

No. 8. Simple shell 0.4.1

  • Simple shell 0.4 +
    • handle arguments for the built-in exit

    • Usage: exit status, *where status is an integer used to exit the shell Beki.

      • From My Simple Shell Output Beki_Shell.

No. 9. setenv, unsetenv

  • Simple shell 1.0 +
  • Implement the setenv and unsetenv builtin commands
  • setenv
    • Initialize a new environment variable, or modify an existing one
    • Command syntax: setenv VARIABLE VALUE
    • Should print something on stderr on failure
  • unsetenv
    • Remove an environment variable
    • Command syntax: unsetenv VARIABLE
    • Should print something on stderr on failure

No. 10. cd

  • Simple shell 1.0 +
    • Implement the builtin command cd:
      • Changes the current directory of the process.
      • Command syntax: cd [DIRECTORY]
      • If no argument is given to cd the command must be interpreted like cd $HOME
      • You have to handle the command cd -
      • You have to update the environment variable PWD when you change directory

No. 11. ;

  • Simple shell 1.0 +
    • Handle the commands separator ;

Beki.

  • From My Simple Shell Output Beki_Shell.

No. 12. && and ||

  • Simple shell 1.0 +
    • Handle the && and || shell logical operators.

Beki.

  • From My Simple Shell Output Beki_Shell.

No. 13. alias

  • Simple shell 1.0 +
    • Implement the alias builtin command
    • Usage: alias [name[='value'] ...]
      • alias:
        • Prints a list of all aliases,
        • one per line,
        • in the form name='value'
      • alias name [name2 ...]:
        • Prints the aliases name, name2, etc
        • 1 per line,
        • in the form name='value'
      • alias name='value' [...]:
        • Defines an alias for each name whose value is given.
        • If name is already an alias,
          • replaces its value with value

No. 14. Variables

  • Simple shell 1.0 +
    • Handle variables replacement

    • Handle the " $? " variable

    • Handle the " $$ " variable Beki.

      • From My Simple Shell Output

Beki_Shell.

No. 15. Comments

  • Simple shell 1.0 +
    • Handle comments ** (#) ** Beki.

      • From My Simple Shell Output

Beki_Shell.

No. 16. File as input

  • Simple shell 1.0 +
    • Usage:
      • simple_shell [filename]
    • Your shell can take a file as
      • a command line argument
    • The file contains all the commands
      • that your shell should run before exiting
    • The file should contain one command per line
    • In this mode,
      • the shell should not print a prompt and
      • should not read from stdin

Resources

  • Read or watch:
    • Unix shell
    • Thompson shell
    • Ken Thompson
    • Everything you need to know to start coding your own shell concept page

Write a simple UNIX command interpreter.

  • man or help:
    • sh (Run sh as well)

Write a simple UNIX command interpreter.

More Info

Output

  • Unless specified otherwise,
    • your program must have
      • the exact same output as
        • 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].

  • 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
    $
    

Write a simple UNIX command interpreter.

List of allowed functions and system calls

  • access (man 2 access)
  • chdir (man 2 chdir)
  • close (man 2 close)
  • closedir (man 3 closedir)
  • execve (man 2 execve)
  • exit (man 3 exit)
  • _exit (man 2 _exit)
  • fflush (man 3 fflush)
  • fork (man 2 fork)
  • free (man 3 free)
  • getcwd (man 3 getcwd)
  • getline (man 3 getline)
  • getpid (man 2 getpid)
  • isatty (man 3 isatty)
  • 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)
  • stat (__xstat) (man 2 stat)
  • lstat (__lxstat) (man 2 lstat)
  • fstat (__fxstat) (man 2 fstat)
  • strtok (man 3 strtok)
  • wait (man 2 wait)
  • waitpid (man 2 waitpid)
  • wait3 (man 2 wait3)
  • wait4 (man 2 wait4)
  • write (man 2 write)

Compilation

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

Testing

  • Your shell should work like this in interactive mode:

           $ ./hsh
          ($) /bin/ls
           hsh main.c shell.c
          ($)
          ($) exit
           $
    

Beki_Shell.

  • But also in non-interactive mode:

           $ echo "/bin/ls" | ./hsh
           hsh main.c shell.c test_ls_2
           $
           $ cat test_ls_2
           /bin/ls
           /bin/ls
           $
           $ cat test_ls_2 | ./hsh
           hsh main.c shell.c test_ls_2
           hsh main.c shell.c test_ls_2
           $
    

@Checks

  • The Checker will be released at the end of the project (1-2 days before the deadline).
  • We strongly encourage the entire class to work together
    • to create a suite of checks covering both
      • regular tests and
      • edge cases for each task.
        • See task 8. Test suite.

Beki_Shell.

About

This is a team project on simple_shell done by me Bereket Dereje Mekkonen

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors