As beautiful as a shell
Minishell is a project from the 42 school curriculum that involves creating a basic shell similar to bash.
This project was realized in 2 months by :
- Vincent Fries (vfries)
- Tom Damerose (tdameros)
make -j
./minishell
The subject only allows the following functions as well as the readline library. Everything else must be recoded from scratch.
| External functions | readline, rl_clear_history, rl_on_new_line, rl_replace_line, rl_redisplay, add_history, printf, malloc, free, write, access, open, read, close, fork, wait, waitpid, wait3, wait4, signal, sigaction, sigemptyset, sigaddset, kill, exit, getcwd, chdir, stat, lstat, fstat, unlink, execve, dup, dup2, pipe, opendir, readdir, closedir, strerror, perror, isatty, ttyname, ttyslot, ioctl, getenv, tcsetattr, tcgetattr, tgetent, tgetflag, tgetnum, tgetstr, tgoto, tputs |
|---|
Not use more than one global variable. Think about it. You will have to explain its purpose.
| Operator | Example command |
|---|---|
| Input redirection: < | grep 'shell' < Makefile |
| Output redirection: > | cat Makefile > test.txt |
| Append output redirection: >> | cat Makefile >> test.txt |
| Here documents: << | cat << EOF |
| Pipes: | | ls | grep 'c' |
| And: && | apt update && apt upgrade |
| Or: || | something || echo Hello World |
| Parenthesis: ( & ) | (ls || echo Hello World) && echo minishell |
Interactive Minishell interprets unclosed quotes and unfinished commands.
Minishell can be executed with the -c option to run a command without entering interactive mode.
| Shortcut | Feature |
|---|---|
| ctrl-C | displays a new prompt on a new line |
| ctrl-D | exits the shell |
| ctrl-\ | does nothing |
| Builtin | Implementation |
|---|---|
| echo | with option -n |
| cd | with only a relative or absolute path |
| pwd | with no options |
| export | with no options |
| unset | with no options |
| env | with no options or arguments |
| exit | with no options |
| alias | with no options |
| unalias | with no options |
Minishell alias implementation is not recursive and does not allow to interpret operators like bash.
- Tildes (
~,~+,~-) - Environment variables (
echo $PWD) - Word splitting
- Wildcards (only
*in every directory:echo /*/*) - Quotes removal (
"l"'s')
At startup the .minishellrc file in the HOME path is executed.
Example :
alias g='git'
alias gcl='git clone'
alias gco='git checkout'
alias gl='git pull'
alias gb='git branch'
alias gp='git push'
alias gst='git status'
alias l='ls -lah --color=auto'
alias la='ls -lAh --color=auto'
alias ll='ls -lh --color=auto'
alias ls='ls -G --color=auto'
alias lsa='ls -lah --color=auto'
alias md='mkdir -p'
alias rd='rmdir'
alias ..='cd ..'
alias ../..='cd ../..'
alias ../../..='cd ../../..'
alias ../../../..='cd ../../../..'
