diff options
author | Tom Ryder <tom@sanctum.geek.nz> | 2016-08-16 19:49:35 +1200 |
---|---|---|
committer | Tom Ryder <tom@sanctum.geek.nz> | 2016-08-16 19:49:35 +1200 |
commit | 6cbb1755813b9fd3ad016aafc202a36eda37718a (patch) | |
tree | d7d985980ef5fa78572f13b867d6b0bdfd9f3a24 /bin/tlcs | |
parent | Apply suffix rules for games/bin building (diff) | |
download | dotfiles-6cbb1755813b9fd3ad016aafc202a36eda37718a.tar.gz dotfiles-6cbb1755813b9fd3ad016aafc202a36eda37718a.zip |
Reverse .m4 translation for binscripts
Either this is overengineering, or I don't understand m4 well enough.
Diffstat (limited to 'bin/tlcs')
-rwxr-xr-x | bin/tlcs | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/bin/tlcs b/bin/tlcs new file mode 100755 index 00000000..30068303 --- /dev/null +++ b/bin/tlcs @@ -0,0 +1,93 @@ +#!/bin/sh +# Execute a command and tag the output of the stdout and stderr streams. +self=tlcs + +# Set the default prefixes and suffixes for stdout/err +out_pref='stdout: ' +err_pref='stderr: ' +out_suff= +err_suff= + +# Parse options out, give help if necessary +while getopts 'co:e:' opt ; do + case $opt in + c) + color=1 + ;; + o) + out_pref=$OPTARG + ;; + e) + err_pref=$OPTARG + ;; + \?) + printf >&2 'Unknown option %s\n' "$opt" + exit 2 + ;; + esac +done +shift "$((OPTIND-1))" + +# We need at least one more argument +if [ "$#" -eq 0 ] ; then + printf >&2 '%s: Need a command to run\n' "$self" + exit 2 +fi + +# If color was requested for the output, try and get a count of available +# colors +[ -n "$color" ] && color_count=$( { + tput colors || tput Co +} 2>/dev/null ) + +# If the color count is greater than 7, we'll color the output +if [ "$((color_count >= 8))" -eq 1 ] ; then + + # Color code for resetting + color_reset=$( { + tput me || tput sgr0 + } 2>/dev/null ) + + # If stdout is a terminal, color it + if [ -t 1 ] ; then + color_stdout=$( { + tput AF 2 || tput setaf 2 + } 2>/dev/null ) + out_pref=${color_stdout}${out_pref} + out_suff=${out_suff}${color_reset} + fi + + # If stderr is a terminal, color it + if [ -t 2 ] ; then + color_stderr=$( { + tput AF 1 || tput setaf 1 + } 2>/dev/null ) + err_pref=${color_stderr}${err_pref} + out_suff=${err_suff}${color_reset} + fi +fi + +# Create a temporary directory with name in $td, and handle POSIX-ish traps to +# remove it when the script exits. +td= +cleanup() { + [ -n "$td" ] && rm -fr -- "$td" + if [ "$1" != EXIT ] ; then + trap - "$1" + kill "-$1" "$$" + fi +} +for sig in EXIT HUP INT TERM ; do + # shellcheck disable=SC2064 + trap "cleanup $sig" "$sig" +done +td=$(mktd "$self") || exit + +# Execute the command, passing stdout and stderr to tl(1) calls as appropriate +# via named pipes +out=$td/out err=$td/err +mkfifo -- "$out" "$err" || exit +tl -p "$out_pref" -s "$out_suff" < "$out" & +tl -p "$err_pref" -s "$err_suff" < "$err" & +"$@" >"$out" 2>"$err" +ex=$? ; wait ; exit "$ex" |