A POSIX compliant shell
Find a file
2026-04-24 21:17:10 +02:00
src feat(exec): export 2026-01-31 20:52:03 +01:00
tests fix: expand tests ast_create_command 2026-01-31 18:51:03 +00:00
.clang-format feat: README, gitgnore and basic project structure 2026-01-06 17:53:41 +01:00
.gitignore Fixed the length of the execution function 2026-01-24 17:35:06 +01:00
build_flemme.sh feat: flemme scripts for building and testing 2026-01-26 18:35:08 +01:00
check_flemme.sh fix: readded fsanitize for check_flemme.sh (linux only) 2026-01-29 20:41:45 +01:00
configure.ac fix(autotools): missing Makefile in configure.ac 2026-01-12 17:29:00 +01:00
Makefile.am feat(autotools): basic usage 2026-01-07 17:38:54 +01:00
README.md doc: Update README 2026-04-24 21:17:10 +02:00

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