Skip to content

rdavid/shellbase

Repository files navigation

Shellbase

             ,,                 ,,    ,,  ,,
           `7MM               `7MM  `7MM *MM
             MM                 MM    MM  MM
    ,pP"Ybd  MMpMMMb.  .gP"Ya   MM    MM  MM,dMMb.   ,6"Yb.  ,pP"Ybd  .gP"Ya
    8I   `"  MM    MM ,M'   Yb  MM    MM  MM    `Mb 8)   MM  8I   `" ,M'   Yb
    `YMMMa.  MM    MM 8M""""""  MM    MM  MM     M8  ,pm9MM  `YMMMa. 8M""""""
    L.   I8  MM    MM YM.    ,  MM    MM  MM.   ,M9 8M   MM  L.   I8 YM.    ,
    M9mmmP'.JMML  JMML.`Mbmmd'.JMML..JMML.P^YbmdP'  `Moo9^Yo.M9mmmP'  `Mbmmd'

test hits of code release) license

About

The shellbase framework serves as a foundation for Unix shell scripts. This framework is mostly POSIX-compliant, Portable Operating System Interface for uniX, ensuring compatibility across Unix-like systems. It offers a range of essential services, including public functions such as logger and multiple validations, signal handling, garbage collection, and support for multiple instances.

The shellbase defines global variables and functions. All functions without base_ prefix are public and could be used by clients. The public functions are, in alphabetical order: aud_only, beroot, beuser, bomb, cheat, cmd_exists, chrono_get, chrono_sta, chrono_sto, cya, die, echo, file_exists, grbt, handle_pipefails, heic2jpg, inside, isempty, isfunc, isnumber, isreadable, issolid, iswritable, log, loge, logw, map_del, map_get, map_put, pdf2jpg, pdf2png, prettytable, prettyuptime, realdir, realpath, semver, timestamp, tolog, tologe, tolower, totsout, tsout, url_exists, user_exists, validate_cmd, validate_var, var_exists, ver_ge, vid2aud, yes_to_continue, ytda.

Global variables have BASE_ prefix and clients could use them. Clients should place temporary files under $BASE_WIP. All functions started with base_ prefix are internal and should not be used by clients. The names are arranged in alphabetical order.

See dotfiles, gento, and toolbox as examples of projects that utilize this framework.

Install

The artifact is a single non-executable POSIX-compliant shell script file base.sh. Install the file from the repository:

git clone git@github.com:rdavid/shellbase.git &&
  ./shellbase/app/install

Install the file from the released version. Some operating systems demands administrative rights to install to /usr/local/bin, use sudo or doas before tar:

REL=0.9.20240303
SRC=https://github.com/rdavid/shellbase/archive/refs/tags/v$REL.tar.gz
curl --location --silent $SRC |
  tar \
    --directory /usr/local/bin \
    --extract \
    --gzip \
    --strip-components=2 \
    shellbase-$REL/lib/base.sh

Verify /usr/local/bin is in your PATH. Then your script can use shellbase:

#!/bin/sh
# shellcheck disable=SC1091 # File not following.
. base.sh
log I\'m using the shellbase.

You can try shellbase without installation:

#!/bin/sh
REL=0.9.20240303
SRC=https://github.com/rdavid/shellbase/archive/refs/tags/v$REL.tar.gz
eval "$(
  curl --location --silent $SRC |
    tar \
      --extract \
      --gzip \
      --to-stdout \
      shellbase-$REL/lib/base.sh
)"
log I\'m using the shellbase.

prettytable example:

. base.sh
{
  printf 'ID\tNAME\tTITLE\n'
  printf '123456789\tJohn Foo\tDirector\n'
  printf '12\tMike Bar\tEngineer\n'
} | prettytable

Output:

+-----------+----------+----------+
|ID         |NAME      |TITLE     |
+-----------+----------+----------+
|123456789  |John Foo  |Director  |
|12         |Mike Bar  |Engineer  |
+-----------+----------+----------+

Test

The project uses Daniel J. Bernstein’s build system redo. You can install Sergey Matveev’s goredo implementation. redo lint applies the following linters to the source files: checkmake, hadolint, shellcheck, shfmt, typos, vale, yamllint. redo test runs unit tests in installed shells. redo test-container runs the tests across various shells in containers. It uses David Rabkin's goredoer to build goredo.

License

shellbase is copyright David Rabkin and available under a Zero-Clause BSD license.