1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun# (C) 2016, "Yann E. MORIN" <yann.morin.1998@free.fr> 3*4882a593Smuzhiyun# License: WTFPL, https://spdx.org/licenses/WTFPL.html 4*4882a593Smuzhiyun 5*4882a593Smuzhiyunmain() { 6*4882a593Smuzhiyun local found ret start d h m mf 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun if ! which unbuffer >/dev/null 2>&1; then 9*4882a593Smuzhiyun printf "you need to install 'unbuffer' (from package expect or expect-dev)\n" >&2 10*4882a593Smuzhiyun exit 1 11*4882a593Smuzhiyun fi 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun start=${SECONDS} 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun ( exec 2>&1; unbuffer make "${@}"; ) \ 16*4882a593Smuzhiyun > >( while read line; do 17*4882a593Smuzhiyun printf "%(%Y-%m-%dT%H:%M:%S)T %s\n" -1 "${line}" 18*4882a593Smuzhiyun done \ 19*4882a593Smuzhiyun |tee -a br.log \ 20*4882a593Smuzhiyun |grep --line-buffered --colour=never -E '>>>' 21*4882a593Smuzhiyun ) 22*4882a593Smuzhiyun ret=${?} 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun d=$((SECONDS-start)) 25*4882a593Smuzhiyun printf "Done in " 26*4882a593Smuzhiyun h=$((d/3600)) 27*4882a593Smuzhiyun d=$((d%3600)) 28*4882a593Smuzhiyun [ ${h} -eq 0 ] || { printf "%dh " ${h}; mf="02"; } 29*4882a593Smuzhiyun m=$((d/60)) 30*4882a593Smuzhiyun d=$((d%60)) 31*4882a593Smuzhiyun [ ${m} -eq 0 ] || { printf "%${mf}dmin " ${m}; sf="02"; } 32*4882a593Smuzhiyun printf "%${sf}ds" ${d} 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun if [ ${ret} -ne 0 ]; then 35*4882a593Smuzhiyun printf " (error code: %s)" ${ret} 36*4882a593Smuzhiyun fi 37*4882a593Smuzhiyun printf "\n" 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun return ${ret} 40*4882a593Smuzhiyun} 41*4882a593Smuzhiyun 42*4882a593Smuzhiyunmain "${@}" 43