Executar sequencialmente o mesmo comando com várias operações

Farto de invocações de comandos repetitivas como em

$> ./rebar get-deps && ./rebar clean && ./rebar compile

Proponho um script de shell simples para reescrever esse tipo de coisa como

$> seq ./rebar get-deps clean compile

Formato

seq [-s | --silent] [-se | --silent-error] [-E | --stop-on-error] command op1 op2 ...

Opções

  • -s | –silent

A saída do comando é despejada

  • -se | –silent-error

Não avise sobre operações com falha

  • -E | –stop-on-error

Pare na primeira operação com falha

Exemplos

$> ../bin/seq.sh  -s -se  -E ./rebar get-deps foo clean bar compile
$> ../bin/seq.sh  -s   -E ./rebar get-deps foo clean bar compile
operation foo failed

O roteiro

#!/bin/bash

function usage() {
echo
`basename $0` "[-s | --silent] [-se | --silent-error] [-E | --stop-on-error] command op1 op2 ..."
}

silentCommand
=false
stopOnError
=false
silentError
=false

continue=true
options
=""
while [ "$continue" == true ]; do
case $1 in
-s | --silent)
shift

silentCommand
=true
options
="$options --silent"
;;
-se | --silent-error)
shift

silentError
=true
options
="$options --silent-error"
;;
-E | --stop-on-error)
shift

stopOnError
=true
options
="$options --stop-on-error"
;;
*)
continue=false
esac
done

if [ $# -lt 2 ]
then
usage

exit
fi

self=$0
cmd
=$1
op
=$2

redirect
="2>&1"
if [ $silentCommand == true ]
then
redirect
="$redirect > /dev/null"
fi

eval "$cmd $op $redirect"

if [ ! $? -eq 0 ]
then
if [ $silentError == false ]
then
echo
"operation $op failed"
fi

if [ $stopOnError == true ]
then
exit
fi
fi

shift
; shift;
if [ $# -ge 1 ]
then
$self $options $cmd $
*
fi