# Introduction
This article demonstrates how to download, compile and install Byron
Rakitzis’ reimplementation of the *rc* shell, originally from the Plan 9
system. The first section is a brief history of *rc* and some of its
newer forms, but feel free to skip ahead to the actual guide.
# History
Around 10 years or so after creating Unix, the Computing Science
Research Center at AT\&T Bell Labs developed the
[Plan 9](https://9p.io/plan9) operating system, which further riffed on
the Unix philosophy. It was only used internally at Bell Labs until the
early ’90s when they made it available to universities and businesses.
Eventually they released it under an open-source license. Today it’s
only really used by hobbyists and people learning about operating
systems.
Anyway, *rc* (short for *“run commands”*) was the system’s canonical
command-line interpreter, and it’s ace. Its syntax is much simpler than
that of the established Bourne shell from which Bash and most other
contemporary shells derive; and rc’s handling of strings and
special characters makes it less error-prone overall.
Many tools from Plan 9, including its fantastic *rc* shell, have been
ported to Unix-like systems under the name *[Plan 9 from User
Space](https://9fans.github.io/plan9port)* (a.k.a. plan9port). A subset
of these programs packaged as [9base](http://tools.suckless.org/9base/)
is provided by Suckless. The two are probably available from your
distribution’s package repository (but keep reading).
An independent project by Byron Rakitzis saw a reimplementation of the
*rc* shell for Unix-like systems. His implementation differs very
slightly from the *true* Plan 9 shell (as ported by plan9port), but
before compiling it can be linked with line-editing libraries such as
GNU readline, which is why I much prefer it for interactive use.
# Install the *rc* shell
I recommend installing [Byron Rakitzis’ reimplementation of
*rc*](https://github.com/rakitzis/rc "rc shell -- independent re-implementation for Unix of the Plan 9 shell (from circa 1992)."),
which provides such nice features as **line editing** and **tab
completions**.
## Compile from source
Clone the GitHub repository and run the bootstrap script:
``` bash
git clone https://github.com/rakitzis/rc
cd rc
./bootstrap
```
This generates an `INSTALL` file with detailed instructions. Then
configure and build like so:
``` bash
sh configure --with-edit=readline
make
sudo make install
```
You now have *rc* installed on your machine. To uninstall, use `sudo
make uninstall` in that same directory.
# Start the *rc* shell
You may need to log out and back in for it to work. Start the shell by
typing
``` bash
rc
```
or, in order to have *rc* behave as a **login shell**, pass the `-l`
flag:
``` bash
rc -l
```
As described in the manual (`man rc`), this tells *rc* to source
`$home/.rcrc` when it starts. Much like one’s
[`.bashrc`](https://wiki.archlinux.org/index.php/Bash#Configuration_files),
you might like to populate that file with commands that
- change your `$prompt`
- change your `$path`
- define functions,
- assign environment variables,
- do whatever else.
In rc, the home directory is stored in both the
lowercase variable \$home
and the usual uppercase
environment variable \$HOME
. Also, the built-in
\$path
variable is a list of directories that is kept in
sync with the usual \$PATH
environment variable, a
colon-separated string of the same directories.
The default prompt is a semicolon, which seems an odd choice. According
to the manual,
> \[t\]he reason for this is that it enables an *rc* user to grab
> commands from previous lines using a mouse, and to present them to
> *rc* for re-interpretation; the semicolon prompt is simply ignored by
> *rc*.
To quit the shell, press Ctrl \+ d or type `exit`.
# Make *rc* your login shell
When you open your terminal, the first program it runs is your **login
shell**. On most Linux machines, users’ login shells are set to Bash by
default. Changing your login shell is easy to do.
Firstly, add *rc*’s full path to your machine’s list of approved login
shells. This must be done as root, as so:
``` bash
sudo su -c 'which rc >> /etc/shells'
```
Let’s do this next step in an *rc* shell, demonstrating its backquote
substitution (analogous to the Bourne shell’s command substitution). And
we’ll use the built-in
[`chsh`](https://manpages.debian.org/stable/passwd/chsh.1.en.html) utility:
``` bash
rc
chsh $USER --shell `{ which rc }
```
That’s it\! Next time you log in as the same user, your tty and
terminals will start with the *rc* shell. This has had no effect on
other users; so if your *rc* executable breaks or disappears, you can
simply log in as root and change your shell back to Bash or what have
you.
## Make use of run commands
Many users like to use `la` as an alias to `ls -A`. To implement this in
our *rc*, let’s define a function in **`$home/.rcrc`**.
Unlike the Bourne shell, rc does not support aliases.
Use functions instead\! The builtin
keyword should be
used to avoid infinite recursion.
``` bash
fn la { ls -A $* }
```
In short, `fn` is the keyword for creating functions, and the braces
contain the sequence of commands the function shall execute. Arguments
of the function are stored in `$1`, `$2`, etc., but `$*` stores the list
of *all* arguments given, which we humbly and helpfully pass straight
through to the `ls` program.
I found that I had to log out and back in for the updated `$home/.rcrc`
to be sourced automatically; starting a new instance of *rc* was not
enough. But we can source the new commands manually with the `.`
built-in, as so:
``` bash
. $home/.rcrc
```
or, if we’re already in the home directory, simply
``` bash
. .rcrc
```