# 42sh - A POSIX shell with a bad name 42sh is a project aiming to implement a POSIX-compliant shell written in C with only the standard library. Source de is fully documented with the doxygen format so you can easily understand how the project works by exploring it. > **Note** This is a school project, therefore it probably won't interest you if you are looking for something useful. ## Getting started ### Build run this command: `autoreconf --force --verbose --install` ### Test run this command: `./configure CFLAGS='-std=c99 -Werror -Wall -Wextra -Wvla'` then: `make` #### Build with ASan run this command: `./configure CFLAGS='-std=c99 -Werror -Wall -Wextra -Wvla -g -fsanitize=address'` or for MacOS (Jean Here): `./configure CFLAGS='-std=c99 -Werror -Wall -Wextra -Wvla -I/opt/homebrew/include' LDFLAGS='-L/opt/homebrew/lib'` then: `make check` ## Project status ### Implemented features * **Command Execution:** `$PATH` search and binary execution (via `fork` and `execvp`) with error return code handling. * **Built-ins:** Native implementation of `echo`, `cd`, `exit`, `export`, `unset`, `set`, `.`, `true`, `false`, as well as loop management with `break` and `continue`. * **Control Structures:** * Conditions: `if / then / elif / else / fi`. * Loops: `while`, `until` and `for`. * **Logical Operators:** Command chaining with `&&`, `||` and negation with `!`. * **Pipelines and Redirections:** * Full management of pipes `|` to connect the output of one process to the input of another. * Single and multiple redirections: `>`, `<`, `>>`, `>&`, `<&`, `<>`. * **Variables Management:** Assignment, variable expansion, and special variables handling like `$?` (return code of the last command). * **Command Grouping:** Execution blocks `{ ... }` and subshells creation `( ... )`. * **Quoting:** Support for weak (`"`) and strong (`'`) quoting for special characters escaping. ## Architecture The shell operates on a classic compilation/interpretation pipeline: 1. **Lexer (Lexical Analysis):** Reads standard input (or script) character by character and generates a stream of "Tokens" (Words, Operators, Redirections). 2. **Parser (Syntax Analysis):** Syntax analyzer that transforms the token stream into a complex Abstract Syntax Tree (AST). This module strictly manages the nesting of control structures and enforces the rigid grammar of the Shell Command Language. 3. **Execution (AST Traversal):** The tree is traversed recursively. Redirections modify file descriptors (`dup2`), child processes are created (`fork`), and commands are executed. ## Authors - Guillem George - Matteo Flebus - Jean Herail - William Valenduc