Por que a interceptação ERR está sendo invocada aqui?

2

Eu tenho a seguinte função para colorir a saída stderr de um comando:

red='tput setaf 1'

colorerr() {
  (trap 'tput sgr0' EXIT; eval "$* 2> >(echo -n \"${red}\"; cat -;)")
}

por exemplo:

colorerr "bash -c 'cd ${WEB_APP_DIR}; npm run-script build'"

O script usa set -e , trap ... ERR e trap ... EXIT para relatar números de linha e rastreamentos de pilha em falhas. Tudo está funcionando bem, exceto se a string de comando passada em colorerr falhar, eu queria pegar o erro e dar um relatório melhor (já que me dizer que uma falha na função colorerr não é útil).

Eu tentei a construção || ... padrão, mas o erro da subshell em colorerr ainda estava acionando o ERR trap . Como teste, tentei o seguinte:

(trap 'tput sgr0' EXIT; eval "$* 2> >(echo -n \"${red}\"; cat -;)") ||
 true

Mas a armadilha ERR ainda é acionada. Por que o || true não está configurando o código de erro como "0" normalmente?

    
por zanerock 07.09.2018 / 16:24

1 resposta

1

Não é realmente uma resposta, mas uma solução alternativa. Tente isto:

col-err() { "$@" 2> >(grep --color .) ; }

A sintaxe é um pouco diferente da função colorerr na questão. Para col-err , não cite o comando a ser executado:

col-err bash -c 'cd ${WEB_APP_DIR}; npm run-script build'

Exemplo que pode ser executado em qualquer lugar:

col-err bash -c 'ls    $SHELL ${SHELL}_no_such ; echo
                 ls -l $HOME   ${HOME}_no_such | head -2'

Como col-err chama grep , funciona com a variável $GREP_COLORS . Para alterar a cor para verde (o primeiro ms=01;32 abaixo) para apenas um uso:

GREP_COLORS='ms=01;32:mc=01;33:sl=:cx=:fn=35:ln=32:bn=32:se=36' \
col-err bash -c 'ls    $SHELL ${SHELL}_no_such ; echo
                 ls -l $HOME   ${HOME}_no_such | head -2'

Nota: sequência de cores adaptada da resposta de Chriki para "Use cores diferentes para todos os outros grep " .

    
por 10.09.2018 / 11:15