September 10, 2019
This post began as a simple question: “How do I make this script I just wrote accessible on the command line?” The answer took us on a journey. Along the way, we learned a lot about what exactly the “command line” is, and how it’s useful for humans doing research and engineering in biology.
The simple answer to the question posed above is: “add the binary to your PATH
environment variable. But what is the PATH
environment variable? Where is it set? What uses it? What’s the command line anyway?
It turns out that “the command line” is a program just like so many others than run on my computer. On the computers most folks use for doing biology, the “command line” is called a “shell”. A shell is a program that runs in an endless loop, always asking for input, reading it, and printing out the result, and then asking for input again. The shell’s only purpose is to ask “What do you want me to do?” and then do it.
The string of characters the shell types when you open it is called the prompt.
Since one particular shell—-Bash—-is the commonest, and Bash uses $
as a
prompt, you’ll usually see lines of code you’re supposed to type into your
terminal written as
$
Doesn’t that look inviting? Type a command, press Enter, and the shell executes the command.
The short answer is that your shell can be configured to look anywhere you want
for commands that it can execute. In the case of Bash (the most common shell),
the environment variable PATH
holds all the places the shell looks for commands.
A simple way to make software that you develop locally available in your shell as first-class functions is to add the directory containing the binaries to your PATH
environment variable.
If you have a project directory containing a build directory where built binaries are placed, then you can add that directory to the PATH
variable such that all the binaries within are accessible in the shell. For example, your project directory is as follows.
├── README.md
├── src
│ ├── main.c
│ ├── lib.c
│ └── test.c
└── build
└── bin
└── my_app
Then you can add the following to your .bashrc
to make the binaries accessible at the command line. You can do this as many times as you wish.
export PATH="/path/to/build/bin:$PATH"
# where this is the absolute path to your binaries