#! /usr/bin/env sh # ╭──────┬───────────╮ # │ main │ constants │ # ╰──────┴───────────╯ RWX_MAIN_NAME="main.sh" RWX_SELF_NAME="rwx" RWX_SELF_COMMAND="_${RWX_SELF_NAME}_cmd_" # ╭──────┬───────────╮ # │ main │ variables │ # ╰──────┴───────────╯ RWX_COMMAND_ARGUMENT="${0}" RWX_SHELL="$(cat "/proc/${$}/comm")" RWX_COMMAND_NAME="$(basename "${RWX_COMMAND_ARGUMENT}" | sed "s|^-||")" case "${RWX_COMMAND_NAME}" in "bash" | "dash" | "sh") unset RWX_COMMAND_NAME ;; *) ;; esac RWX_ROOT_SYSTEM="/usr/local/lib/${RWX_SELF_NAME}" RWX_SELF_USER="${HOME}/${RWX_SELF_NAME}" RWX_MAIN_PATH="${RWX_ROOT_SYSTEM}/${RWX_MAIN_NAME}" # ╭──────┬───────╮ # │ main │ shell │ # ╰──────┴───────╯ # test if active shell is in interactive mode rwx_shell_interactive() { case "${-}" in *i*) ;; *) return 1 ;; esac } # ╭──────┬─────╮ # │ main │ log │ # ╰──────┴─────╯ __rwx_log() { if rwx_shell_interactive; then [ ${#} -gt 0 ] || set -- "" local line for line in "${@}"; do echo "${line}" done fi } # ╭──────┬──────╮ # │ main │ find │ # ╰──────┴──────╯ # find directory’s files by extension rwx_find_extension() { local extension="${1}" local root="${2}" local file="${3}" set -- \ "${root}" \ -name "*.${extension}" \ -type "f" [ -n "${file}" ] && set -- "${@}" \ -not \ -name "${file}" find "${@}" \ -printf "%P\n" | sort } # find directory’s sh files rwx_find_shell() { rwx_find_extension "sh" "${@}" } # ╭──────┬─────╮ # │ main │ ifs │ # ╰──────┴─────╯ rwx_ifs_set() { _RWX_IFS="${IFS}" IFS=" " } rwx_ifs_unset() { IFS="${_RWX_IFS}" unset RWX_IFS } # ╭──────┬────────╮ # │ main │ source │ # ╰──────┴────────╯ rwx_source() { local path="${1}" [ -d "${path}" ] || return 1 local count module count=0 __rwx_log "" \ ". ${path}" rwx_ifs_set for module in $(rwx_find_shell "${path}" "${RWX_MAIN_NAME}"); do count=$((count + 1)) __rwx_log "$(printf "%02d" "${count}") ${module%.sh}" module="${path}/${module}" # shellcheck disable=SC1090 . "${module}" done rwx_ifs_unset } # ╭──────╮ # │ main │ # ╰──────╯ # run initial steps rwx_main() { # system root if ! rwx_source "${RWX_ROOT_SYSTEM}"; then __rwx_log "Not a directory: ${RWX_ROOT_SYSTEM}" return 1 fi # user root rwx_source "${RWX_SELF_USER}" # context / command if [ -n "${RWX_COMMAND_NAME}" ]; then "${RWX_SELF_COMMAND}${RWX_COMMAND_NAME}" "${@}" # context / shell else rwx_self_init fi } # run main function rwx_main "${@}"