#!/usr/bin/env bash ### ### *nuxr-nuxsh* is wrapped bash interpreter for *nux-env* enhanced bash scripts ### and provides out of the box support for command-style scripts (similar in ### usage such as apt, git) with following features out of the box: ### ### task selection:: ### Automaticly selects correct tasks, displays help if ### task does not exists. ### logging:: ### Using *nux.log* function and changing output using ### *debug*, *trace* prefixes ### help display:: ### Automated help display when no arguments are provided. ### Uses source comments as source for help. ### ### ### # Writing nux-runner scripts ### ### *nux-runner* scripts are basicly bash scripts with some additional conventions. ### ### ### ### ### ### 1. Shebang:: ### Shebang (*#!*) at the start of file is *#!/usr/bin/env nuxr-nuxsh* ### 2. Tasks:: ### Script usually does only defines functions in form task {taskname} ### where taskname ### ## Defining a task ### ### ### ### readonly NUX_RUNNER_BIN_DIR=$(dirname $(realpath ${BASH_SOURCE[0]})) source $NUX_RUNNER_BIN_DIR/../inc/nux.inc.sh readonly NUX_RUNNER=$NUX_RUNNER_BIN_DIR/nuxr-nuxsh; nux.use nuxr nux.use nux.cfg ## ## Additional commands provided by *nux-runner*: ### *nux-runner* automaticly provides following tasks to any script it executes: ## ## debug:: [] ## Runs specified task with debug messages enabled. task.debug() { nux.log.level debug nuxr.run "$@" } ## trace:: [] ## Runs specified task with debug & trace enabled. task.trace() { nux.log.level trace nuxr.run "$@" } ## help:: [command] ## Display help for command or topic if specified. Otherwise displays ## documentation. task.help() { nuxr.task.help "$@" } ## config:: [type] name [value] ## Reads or writes application specific configuration option. ### ### There are 3 *types* of configuration: ### dist:: ### Distribution provided configuration. Read-only configuration. ### global:: ### Global (user-specific) provided configuration. This configuration is ### usually stored in *~/.config/{app-name}/config.yml* ### local:: ### Local configuration. ### ### The resulting application configuration is merger of these three (if available) ### with following preference (most-specific one): ### local, global, dist ### task.config() { nux.log trace "global is" $(nux.cfg.dir.global) nux.log trace "dist is" $(nux.cfg.dir.dist) nux.log trace "local is" $(nux.cfg.dir.local) if [ "$#" -ge 3 ] ; then nux.cfg.write "$@" else nux.cfg.read "$@"; fi } task.() { task.help } ## interactive:: ## Executes interactive application shell. task.interactive() { nuxr.task.interactive "$@" } ### ### if [ "$NUX_RUNNER" = "$(realpath "$0")" ] then NUX_SCRIPT=$1; shift; else NUX_SCRIPT=$0; NUX_NO_INCLUDE="no include"; fi if [ -n "$NUX_SCRIPT" ]; then # Determines script NUX_SCRIPT_DIR=$(dirname "$NUX_SCRIPT") NUXR_APP_BIN=$(realpath "$NUX_SCRIPT") NUXR_APP_BIN_DIR=$(dirname "$NUXR_APP_BIN") NUXR_APP_DIR=$(dirname "$NUXR_APP_BIN_DIR") NUXR_APP_NAME=$(basename "$NUX_SCRIPT") NUX_SCRIPTNAME=$(basename "$NUX_SCRIPT") NUX_APP_NAME="${NUX_APP_NAME:=$NUXR_APP_NAME}" NUX_APP_DIR="${NUX_APP_DIR:=$NUXR_APP_DIR}" nux.log trace "NUX_SCRIPT env: " $(set | grep NUX_SCRIPT) if [ -z "$NUX_NO_INCLUDE" ] then nux.log debug "Including script: $NUX_SCRIPT" nux.log trace "NUX_SCRIPT env: " $(set | grep NUX_SCRIPT) compiledir=${TMPDIR:=/tmp} compilefile=$(realpath "$NUX_SCRIPT" | md5sum | cut -d" " -f1) #FIXME: If App in NUX-ENV, use global cache and not generated naming. if [ "$NUX_ENV_DIR" = "$NUXR_APP_DIR" ]; then compiledir="$NUX_CACHE_DIR/bin" compilefile="$NUXR_APP_NAME" fi compilefile="$compiledir/$compilefile.nuxr.nuxsh" nux.log debug "Compiled script:" $compilefile nux.nuxsh.use "$NUX_SCRIPT" "$compilefile"; NUX_NO_INCLUDE="no-include" fi nuxr.main "$@" else echo Usage: nux-runner [script] [task] [options] echo grep "^\#\#" "$NUX_RUNNER" | sed -re "s/^#+ ?(.*)/\1/gi" | nux.help.shelldoc echo fi