# Simple UNIX Shell A lightweight command-line shell implemented in C, designed to emulate core functionalities of UNIX shells like `sh` or `bash`. This shell supports **process management**, **I/O redirection**, **pipelining (|)**, **subshells**, **logical operators (&&, ||)**, **interactive input handling including autocompletion** and **basic signal handling**. The implementation demonstrates system-level programming concepts using **POSIX APIs**. --- ## Features - **Command Execution** Executes external programs using `fork()` and `execvp()`, with environment lookup via `$PATH`. - **Foreground and background job execution** Commands can be run in the background by appending `&`. - **Redirection** Input/output redirection using `<`, `>`, and `>>`. _Examples:_ - `cat < input.txt` - `ls > out.txt` - `echo foo >> log.txt` - **Quoting and escape sequences** Basic support for `"quoted strings"` and escape sequences like `\ ` or `\"`. - **Logical Operators** Implements support for `&&` and `||` operators, enabling conditional command execution. These operators can be combined with pipelines and subshells. - **Subshells** Commands enclosed in parentheses `()` are executed in subshells, enabling complex nested logic. - **Pipelines** Unix-style pipelines using the pipe (|) operator. Data is passed from one process to another via standard input/output. _Example: `cat file.txt | grep foo | sort`_ - **Directory Navigation** Supports the built-in `cd` command to change the current working directory via `chdir()`. - **Autocompletion (Tab)** Custom autocompletion implemented using raw terminal input: - If the current token is a command: matches against executables in `$PATH`. - Otherwise: matches file and directory names from the current or specified path. - **Interactive Line Editing** Terminal is switched to non-canonical mode. Input handling is implemented manually: - Character-by-character input display. - Left/right arrow keys for cursor movement. - `Backspace` support with live line re-rendering. - `Ctrl+D` to terminate the shell. - `Tab` triggers autocompletion. - **Signal handling** Handles SIGCHLD to reap zombie processes and prevent defunct children. --- ## Technologies Used - **Language**: C (C99) - **System APIs**: POSIX (`fork`, `execvp`, `waitpid`, `pipe`, `dup2`, `tcsetpgrp`, etc.) - **Memory handling**: dynamic memory allocation (`malloc`, `free`) - **Terminal control**: `tcgetpgrp`, `tcsetpgrp`, `tcgetattr`, `tcsetattr` --- ## Limitations While the shell supports many core UNIX behaviors, it has some limitations compared to full-featured shells: - No scripting constructs (`if`, `while`, `for`, etc.) - No variable expansion (e.g. `$HOME`, `$PATH`, `$?`) - No command substitution (e.g. `` `command` `` or `$(command)`) - No history (up arrow) - No job control (e.g. fg, bg, jobs). - No advanced signal features (sigaction, sigprocmask, kill, etc.). You’ll see a prompt where you can enter commands, use pipes, redirection, and job control. You can also interact via signals like Ctrl+C and Ctrl+Z.