The letter A styled as Alchemists logo. lchemists
Published August 20, 2014 Updated October 1, 2023
Bashsmith Icon



Bashsmith is a project template for smithing new Bash shell-based projects based on best practices. This project is meant to be cloned and customized for your specific shell scripting needs giving you a foundation from which to get started faster than with an empty slate.


  • Provides default project structure for creating new Bash projects.

  • Provides default settings for making Bash scripts easier to develop and debug.



To install, run:

git clone
cd bashsmith
git checkout 5.2.5


File Structure

All files located within this project provide the basic structure/blueprint for creating new Bash script projects. The structure is organized as follows:

├── CHANGES.adoc          # The details of past version releases.
├── CODE_OF_CONDUCT.adoc  # Guidelines for encouraging harassment-free contributions.
├── CONTRIBUTING.adoc     # The details of how to contribute to the project.
├── LICENSE.adoc          # The license and copyright legalities of the project.
├── README.adoc           # The project overview, setup, usage, testing, etc.
├── bin                   # A folder for executable Bash scripts.
│   └── run               # The main run script (which loads the lib and settings).
├── lib                   # A folder for Bash functions and custom code.
│   └──            # Provides CLI prompt options for the main `run` script.
├── settings              # The global/project settings for easy manipulation/tweaking.
│   └──           # The global settings (set with safe defaults).


The following documents what each template option is:

# Exit, with error message, when attempting to use an undefined variable.
# Alias: `set -u`.
set -o nounset

# Abort script at first error when a command exits with non-zero status.
# Alias: `set -e`.
set -o errexit

# Return exit status of the last command in the pipe that returned a non-zero return value.
set -o pipefail

# Defines newlines and tabs as delimiters for splitting words and iterating arrays.


For debugging purposes, you can add the following option:

# Prints all executed commands.
# Alias: `set -x`.
set -o xtrace

The above is useful for debugging purposes but probably not something you want always enabled.

💡 For additional options, use help set to learn more.


To contribute, run:

git clone
cd bashsmith


Consider using Bats.


Engineered by Brooke Kuhlmann.