aboutsummaryrefslogblamecommitdiff
path: root/bin/tlcs.mi5
blob: 519a41f8965f21ebacca555b3d5edd17227e4c4c (plain) (tree)
1
2
3
4
5
6
7
8
9
10
                                                                        
         
 




                                                      

                                           
                              
                


                   
          
                            
              
          
                            
              
           
                                                   





                     

                                    
                                                    


          
                                                                         
                                   


                                   
                     
 
                                                            
                                           


                              
                            

                   


                                       

                                     

                                           

      


                                       

                                     

                                           


      


                          
 

                                                                    
                       




                                           
# 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; otherwise default to zero
[ -n "$color" ] && color_count=$( {
    tput colors || tput Co
} 2>/dev/null )
: "${color_count:=0}"

# If the color count is 8 or greater, 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

<%
include(`include/mktd.m4')
%>

# Execute the command, passing stdout and stderr to tl(1df) 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"