| src | ||
| tests | ||
| .clang-format | ||
| .gitignore | ||
| build_flemme.sh | ||
| check_flemme.sh | ||
| configure.ac | ||
| Makefile.am | ||
| README.md | ||
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:
$PATHsearch and binary execution (viaforkandexecvp) with error return code handling. - Built-ins: Native implementation of
echo,cd,exit,export,unset,set,.,true,false, as well as loop management withbreakandcontinue. - Control Structures: * Conditions:
if / then / elif / else / fi.- Loops:
while,untilandfor.
- Loops:
- 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:
>,<,>>,>&,<&,<>.
- 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:
- Lexer (Lexical Analysis): Reads standard input (or script) character by character and generates a stream of "Tokens" (Words, Operators, Redirections).
- 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.
- 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