- Done by:
- Bereket Dereje Mekonnen
- 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
| 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 | |||
| 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 | |||
- At the end of this project,
- You are expected to be able to explain to anyone,
- Without the help of Google:
- You are expected to be able to explain to anyone,
- 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”?
- 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.
- 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
- having contributed content to the repository.
- listing all individuals
- 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.
- If you and your partner have a repository with the same name in both your accounts,
- 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 beautiful code that passes the Betty checks.
- 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)
- Display a prompt and wait for the user to type a command.
- You don’t have to:
- Simple shell 0.1 +
- Handle command lines with arguments
- Simple shell 0.2 +
- 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
- Simple shell 0.4 +
- 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
- Simple shell 0.2 +
- You are not allowed to use strtok
- Simple shell 0.4 +
- 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
- 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
- Implement the builtin command cd:
- Simple shell 1.0 +
- Handle the commands separator ;
- Simple shell 1.0 +
- Handle the && and || shell logical operators.
- 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
- alias:
- Simple shell 1.0 +
- 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
- Usage:
- Read or watch:
- Unix shell
- Thompson shell
- Ken Thompson
- Everything you need to know to start coding your own shell concept page
- man or help:
- sh (Run sh as well)
- 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 exact same output as
- your program must have
- The only difference is
- when you print an error,
- the name of the program
- must be equivalent to your argv[0].
- the name of the program
- when you print an error,
-
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 $
- 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)
- Your shell will be compiled this way:
- gcc -Wall -Werror -Wextra -pedantic -std=gnu89 *.c -o hsh
-
Your shell should work like this in interactive mode:
$ ./hsh ($) /bin/ls hsh main.c shell.c ($) ($) exit $
-
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 $
- 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.
- to create a suite of checks covering both


























