This is a simple UNIX command interpreter based on bash and Sh.
A custom sh for learning purposes was developed by cohort #8 students Aminu Rabiu & Abdullateef Odufeso.
simple_shell is a command-line interpreter or shell that provides a command line user interface for Unix-like operating systems. The shell is both an interactive command language and a scripting language, and is used by the operating system to control the execution of the system using shell scripts.
- Unix shell
- Thompson shell
- Ken Thompson
- Run - man sh
The code must be compiled this way:
*gcc -Wall -Werror -Wextra -pedantic -std=gnu89 .c -o hsh
As a consequence, be careful not to push any c file containing a main function in the root directory of your project (you could have a test folder containing all your tests files including main functions)
The main files will include your main header file (main.h): #include main.h
Your shell should work like this in interactive mode:
$ ./hsh
($) /bin/ls
hsh main.c shell.c
($)
($) exit
$
But also in non-interactive mode:
$ echo "/bin/ls" | ./hsh
hsh main.c shell.c test_ls_2
$
$ cat test_ls_2
/bin/ls
/bin/ls
$
$ cat test_ls_2 | ./hsh
hsh main.c shell.c test_ls_2
hsh main.c shell.c test_ls_2
$
Name | Information | Relevant Files |
---|---|---|
_getline.c |
Custom made replicate of getline in C | _getline |
_cd.c |
Custom made replicate of cd in shell | _cd chdir_error update_pwd free_cd |
_arguments.c |
Contain functions for spliting strings into words | _arguments word_len count_words |
environ_utils.c |
Contains functions related to the environent | _getline _path_directories _path_directories_list _setenv unsetenv |
more_environ_utils.c |
Contains functions related to the environent | add_environment remove_environment _which _pathfinder |
strfunc.c |
Contains functions relating to strings | _strlen _strchr _strstr strcat _strcpy |
more_strfunc |
Contains more functions relating to strings) | print_number _strcmp _str_upper _isupper |
even_more_strfunc |
Contains even more functions relating to strings | _strtok check_token |
print_functions.c |
Contains functions relatung to stdout | _puts _putchar error_message invalid_file |
memory_functions.c |
Contains memory management functions | _realloc _malloc2D free_array2D |
link_utils.c |
Contains functions related to linked lists | linked_list free_list |
hsh.c |
Contains the hsh shell main program | hsh |
shell.h |
Header file | None |
(File Name) |
(Description here) | (Extra files needed by this particular file) or None |
(File Name) |
(Description here) | (Extra files needed by this particular file) or None |
(File Name) |
(Description here) | (Extra files needed by this particular file) or None |
(File Name) |
(Description here) | (Extra files needed by this particular file) or None |
Write a beautiful code that passes the Betty checks
Write a UNIX command line interpreter.
Usage: simple_shell Your Shell should:
Display a prompt and wait for the user to type a command. A command line always ends with a new line.
The prompt is displayed again each time a command has been executed.
The command lines are simple, no semicolons, no pipes, no redirections or any other advanced features.
The command lines are made only of one word. No arguments will be passed to programs.
If an executable cannot be found, print an error message and display the prompt again.
Handle errors.
You have to handle the “end of file” condition (Ctrl+D)
You don’t have to:
use the PATH
implement built-ins
handle special characters : ", ', `, , *, &, #
be able to move the cursor
handle commands with arguments
execve will be the core part of your Shell, don’t forget to pass the environ to it…
Handle command lines with arguments
Handle the PATH
fork
must not be called if the command doesn’t exist
Implement the exit
built-in, that exits the shell
Usage: exit
You don’t have to handle any argument to the built-in exit
Implement the env built-in, that prints the current environment
Write your own getline
function
Use a buffer to read many chars at once and call the least possible the read
system call
You will need to use static
variables
You are not allowed to use getline
You are not allowed to use strtok
handle arguments for the built-in exit
Usage: exit status, where status is an integer used to exit the shell
Implement the setenv
and unsetenv
builtin commands
setenv
- Initialize a new environment variable, or modify an existing one
- Command syntax:
setenv VARIABLE VALUE
- Should print something on stderr on failure
unsetenv
- Remove an environment variable
- Command syntax:
unsetenv VARIABLE
- Should print something on stderr on failure
Implement the builtin command cd
:
- Changes the current directory of the process.
- Command syntax: cd [DIRECTORY]
- If no argument is given to cd the command must be interpreted like cd $HOME
- You have to handle the command cd -
- You have to update the environment variable PWD when you change directory
man chdir
, man getcwd
Handle the commands separator ;
Handle the &&
and ||
shell logical operators
- Implement the
alias
builtin command - Usage:
alias [name[='value'] ...]
alias
: Prints a list of all aliases, one per line, in the formname='value'
alias name [name2 ...]
: Prints the aliasesname
,name2
, etc 1 per line, in the formname='value'
alias name='value' [...]
: Defines an alias for eachname
whosevalue
is given. Ifname
is already an alias, replaces itsvalue
with value
Handle variables replacement
Handle the $?
variable
Handle the $$
variable
Handle comments (#
)
Usage: simple_shell [filename]
Your shell can take a file as a command line argument
The file contains all the commands that your shell should run before exiting
The file should contain one command per line
In this mode, the shell should not print a prompt and should not read from stdin
- Abdullateef Odufeso
- Aminu Rabiu