Skip to content

This is a simple UNIX command interpreter based on bash and Sh.

Notifications You must be signed in to change notification settings

arabiu033/simple_shell

Repository files navigation

simple_shell

Description


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.


Resources



Compilation


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

Testing


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
$

Files contained in this repository


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

Tasks required for this project


  1. Betty would be proud

Write a beautiful code that passes the Betty checks

  1. Simple shell 0.1

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…

  1. Simple shell 0.2

Handle command lines with arguments

  1. Simple shell 0.3

Handle the PATH
fork must not be called if the command doesn’t exist

  1. Simple shell 0.4

Implement the exit built-in, that exits the shell
Usage: exit
You don’t have to handle any argument to the built-in exit

  1. Simple shell 1.0

Implement the env built-in, that prints the current environment

  1. Simple shell 0.1.1

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

  1. Simple shell 0.2.1

You are not allowed to use strtok

  1. Simple shell 0.4.1

handle arguments for the built-in exit
Usage: exit status, where status is an integer used to exit the shell

  1. setenv, unsetenv

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
  1. cd

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

  1. ;

Handle the commands separator ;

  1. && and ||

Handle the && and || shell logical operators

  1. alias

  • Implement the alias builtin command
  • Usage: alias [name[='value'] ...]
    • alias: Prints a list of all aliases, one per line, in the form name='value'
    • alias name [name2 ...]: Prints the aliases name, name2, etc 1 per line, in the form name='value'
    • alias name='value' [...]: Defines an alias for each name whose value is given. If name is already an alias, replaces its value with value
  1. Variables

Handle variables replacement
Handle the $? variable
Handle the $$ variable

  1. Comments

Handle comments (#)

  1. File as input

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

Authors ©

  • Abdullateef Odufeso
  • Aminu Rabiu

About

This is a simple UNIX command interpreter based on bash and Sh.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages