The 42sh is a project carried out by groups of 5 (see Contributors, during our 1st year in EPITECH Grand Ecole program.
Its purpose is to recreate in C a Unix shell based on TCSH.
In addition, we've taken inspiration from Powerlevel10k for our shell prompt.
You can run 42sh like this :
./42shYou can execute script with 42sh like this :
./42sh [script]You can also add the 42sh to the shebang of a script, and when you run the script it will use the 42sh.
For more information, please see the help section.
> ./42sh --help
USAGE
./42sh
./42sh [script]
DESCRIPTION
A Unix shell based on TCSH.
You can execute the help command to see the list of available builtins.Our 42sh includes many of the features found in TCSH :
- Executing a simple command
- Executing recreated builtins :
- about
- alias
- cd
- echo
- else
- end
- endif
- env
- exit
- foreach
- help
- history
- if
- repeat
- set
- setenv
- source
- unalias
- unset
- unsetenv
- where
- which
- Dynamic prompt
- Dynamic line edition (use arrow and ctrl command)
- Use of history and event (all commands are stock in the .42sh_history)
- Use of variable (local and environmental)
- Handle of specials variables (~, ? and some other variables)
- Handle backticks ("`")
- Handle semi-colons (";")
- Handle operators ("&&" and "||")
- Handle pipes ("|")
- Handle redirection ("<", "<<", ">" and ">>")
- Handle inhibitors ('"', "'" and "\")
- Handle parentheses ("()")
- Handle globbing ("*", "?", "[" and "]")
- Handle alias
- Handle scripting and scripting commands (if, else, endif, foreach and end)
The result of this project is a almost perfect shell, very similar to TCSH.
If you discover a problem or an error, don't hesitate to create an issue and report it to us as soon as possible.
| Category | Percentage | Numbers of tests | Crash |
|---|---|---|---|
| basic tests | 100% | 4/4 | No |
| path handling | 100% | 5/5 | No |
| setenv and unsetenv | 100% | 2/2 | No |
| builtin cd | 100% | 3/3 | No |
| line formatting (space and tabs) | 100% | 8/8 | No |
| error handling | 100% | 6/6 | No |
| separator | 100% | 1/1 | No |
| simple pipes | 100% | 3/3 | No |
| advanced pipes | 100% | 6/6 | No |
| redirections | 100% | 5/5 | No |
| advanced manipulations | 100% | 3/3 | No |
| && and || tests | 100% | 3/3 | No |
| globbing | 100% | 1/1 | No |
| var interpreter | 100% | 3/3 | No |
| inhibitor | 100% | 2/2 | No |
| magic quotes | 100% | 3/3 | No |
| alias | 100% | 4/4 | No |
| scripting | 100% | 1/1 | No |
| foreach | 100% | 1/1 | No |
| which | 100% | 2/2 | No |
| where | 100% | 2/2 | No |
| if | 50% | 1/2 | No |
| repeat | 100% | 1/1 | No |
| parenthesis | 0% | 0/1 | No |
| Results | 97,2% | 70/72 | No |
Functional tests were carried out with a bash tester and unit tests using criterion.
Unit tests are still to be performed, but a large part of the code is already covered:
- Lines: 84.8%
- Functions: 94.7%
- Branches: 45.4%
You can run the tester with this command :
./tester.shYou can compile the project and run the tester with this command :
make testsYou can compile the project and run the unit tests with this command :
make tests_runFor more details, please click here.
You can compile the project with this command :
makeIf you want to debug the program, you can compile the project with this :
make debug If you want clean the project, you can run this command :
make fcleanYou can clean and compile the project with make re and for debugging make re_debug
You can compile the unit tests with this command :
make unit_testsThe documentation is accessible here.
You can generate the documentation with this command :
make docYou need multiple package for generate them :
- doxygen
- doxygen-latex
- doxygen-doxywizard
- graphviz
- You'll need to create a branch where you'll push your code. Once you've completed your tasks on this branch, we'll work together to merge it and check that everything works.
- Every function you add must be code-style and documented.
- Before merging, you'll need to check that all unit tests pass by running
make tests_run. - If the github actions don't succeed, then ask yourself some questions
- Each commit will contain
[+]or[-]or[~]followed by a message[+]: Added functionality[-]: Delete feature[~]: Feature modification
Of course, in exceptional cases, we may depart from these rules.
For this project, we were a group of 5 people. Here are the people in the group:
- Arthur WARIN : also published the 42sh
- Christophe VANDEVOIR : also published the 42sh
- Gianni TUERO : also published the 42sh
- Nicolas TORO : also published the 42sh
- Raphael ROSSIGNOL : also published the 42sh
