/rshell

A lightweight shell written in C++ for my CS100 course

Primary LanguageC++GNU General Public License v3.0GPL-3.0

Rshell

A lightweight shell written in C++ for my CS100 course

Installing

To install rshell simply run the following commands in any terminal:

$ git clone  https://github.com/avere001/rshell.git
$ cd rshell
$ git checkout hw0
$ make

To run rshell simply run:

$ bin/rshell

Usage

rshell can run any program located in PATH or your current directory.

The format for running a program is as follows:

$ command [argument 1] [argument 2] ...

arguments are whitespace seperated

Connectors

Connectors can be used to run multiple commands conditionally. The format is as follows:

$ command1 [arguments1] [connector] [command2] [arguments2] ...

Notes on syntax:

  • Connectors need not be seperated from commands by any whitespace.
  • Connectors must be immediately preceded by a command.
  • Connectors followed immediately by another connector are invalid and will throw an error
  • Connectors in the beginning of a line are invalid and will throw an error
  • Connectors at the end of a line will simply be ignored.

Valid connectors

  • ; - runs the command following the connector always
  • && - runs the command following the connector only if the previously executed command resulted in a success
  • || - runs the command following the connector only if the previously executed command resulted in a failure

Notes:

Commands are evaluated from left to right. If a command doesn't exist or otherwise fails to execute, it will result in a failure. The exception is that if a command is ignored because of a connector, the success is determined by the previously executed command. Otherwise, If the command exists and successfully executes, then the success is determined by the return of the command (0 = success, anything else = failure)

Example:

$ true; echo command executed
command executed
$ false; echo command executed
command executed
$ true && echo command executed
command executed
$ false && echo command executed
$ true || echo command executed
$ false || echo command executed
command executed
$ false ; echo commands && echo can || echo not && echo be ; echo chained!
commands
can
be
chained!

Output redirection

The output of a command may be redirected to a file like so:

$ echo abc123 > test
$ cat test
abc123

To append to an existing file use >> instead

$ echo abc > test
$ cat test
abc
$ echo abc > test
$ cat test
abc
$ echo 123 >> test
$ cat test
abc123

Additionally, you may specify the file descriptor to redirect by using #> or #>>

Input redirection

You may use a file as input to a command like so:

$ echo abc > test
$ cat < test
abc

You may also use a string directly by using <<< instead

$ cat <<< test
test

Piping

You may pipe the output of one command to the input of another like so:

$ echo test | cat
test
$ #you can chain them
$ echo test | tr a-z A-Z | cat
TEST

piping may be combined with redirection and connectors

$ echo test > abc
$ cat < abc | cat > def ; cat < def | tr a-z  A-Z | cat
TEST

Comments

Any text on a line following a # will be ignored.

Example:

$ echo this won't be ignored #but this will!
this won't be ignored

Quitting rshell

In order to properly close rshell, simply type exit just like any other command. exit will ignore any arguments passed to it. Additionally any commands connected after exit is called will not be executed

$ exit

Builtins

currently the only shell builtin is cd.

cd

cd can be used to change directories

Usage

cd home:

$ cd

cd to path. this can be relative or absolute:

$ cd /
$ cd bin

finally, to go up a directory:

cd dir1
cd ../dir2
cd - #will take you to dir1

Signals

Currently only supports SIGINT

send SIGINT to a process by pressing CTRL+C in any running program

Bugs:

  • There is no way to pass ;, &&, ||, &, |, #, >, <, or whitespace as arguments
  • using >>> will redirect to a file called > rather than error
  • You cannot redirect the output of cd -