42sh
Présentation par Loïc BRANSTETT,
Guillaume GEOFFROY, Yann DIAS-de-NOVAES et Yvan FRANCOIS
Le 31/05/2019
Sommaire
- Présentation du projet
- Organisation
- Architecture
- Fonctionnalités
- Tests automatisés
- Bonus
- Conclusion
Présentation du projet
42sh est un "tcsh"
Organisation
Icons made by Eucalyp and Freepik from flaticon.com is licensed by CC 3.0 BY
Organisation
Architecture
Icons made by Freepik from flaticon.com is licensed by CC 3.0 BY
Modulaires
Architecture
Noyau
sh
init
get_next_line
main
Commandes
block
pipe
parsing
check
Builtins
echo
if, else, foreach
env
...
cmd
cd
alias
Execution
eval_block
redirections
eval_cmd
exec
sub-shell
Parsing
estring
sstring
pstring
Prompt
actions
input
cursor
wstring
...
env
Architecture
Librairies:
- libgnl (from get_next_line)
- libmy (from cpool)
- ncurses (for prompt)
- libc (for execve, glob, ...)
- wstring (new type)
typedef struct {
wchar_t *chars;
int lenght;
int size;
} wstring_t;
Fonctionnalités
- Variables d'environnement
- Redirections et pipes
- Séparateurs (; && ||)
- $PATH et gestion des chemins
- Prompt (multi-lignes)
- Inibitors (échappement)
- Globing (*’, ‘?’, ‘[’, ’]’)
- Parenthèses (sous-shell)
- Variables spéciales (postcmd, cwdcmd, precmd and ignoreof)
- Historique et alias
- Job control (&, fg, bg)
- Backtick (`)
- Scripting (SheBang)
$ $PATH $TOTO
$ cat < input > ouput
$ ls | grep fichier && echo found!
$ setenv $PATH "/usr/bin:."
$ echo "salut \
je suis Loïc"
$ echo \n "\n" '\n'
$ ls *.c include/my_{sh,hs}.h
$ ( cd; pwd; ); pwd;
$ alias bat echo
$ bat !!
$ sleep 5 & ; jobs ; fg 1
$ echo `ls`
#!./42sh
Fonctionnalités
Tests automatisés
Lines
Branching
50%
60%
220 tests - criterion
5 tests - script
Tests automatisés
Noyau
Commandes
Builtins
70%
Execution
71%
Parsing
Prompt
0%
87%
92%
84%
Bonus
- kill
- builtins
- \x23 \15 (hexa et octal)
- ~/.42rc
- Chemin minimisé
- Support de l'Unicode
- if (sur une ligne)
- -c cmd
- --help
- $? et $$
- $SHELL et $SHLVL
- \alias
$ kill 42sh
$ builtins
kill echo cd setenv env [...]
$ echo -n "->\x0B<-"
->
<-
/home/user/Epitech/PSU_42sh_2018
-> ~/E/PSU_42sh_2018
$ echo éà•
éà•
$ if ( aa == aa ) echo ==
==
$ echo $? $$
0 8125
$ echo $SHELL $SHLVL
42sh 1
$ \ll
ll: Command not found.
Bonus
Conclusion
Questions ?
FIN
42sh
By urgau-1
42sh
- 116