Como prefixar qualquer saída em um script bash? [duplicado]

11

Quando um script é executado, os comandos nele podem produzir algum texto para stdout / stderr. Bash em si também pode produzir algum texto.

Mas se alguns scripts estão sendo executados ao mesmo tempo, é difícil identificar de onde vem um erro.

Então é possível inserir um prefixo em todas as saídas do script? Algo como:

#!/bin/bash
prefix 'PREFIX' &2
echo "wrong!" >&2

Então:

$ ./script.sh
PREFIXwrong!
    
por Magicloud 27.04.2018 / 15:33

3 respostas

24

Você pode redirecionar stderr / stdout para uma substituição de processo que adiciona o prefixo de escolha. Por exemplo, este script:

#! /bin/bash
exec > >(sed 's/^/foo: /')
exec 2> >(sed 's/^/foo: (stderr) /' >&2)
echo foo
echo bar >&2
date

Produz esta saída:

foo: foo
foo: (stderr) bar
foo: Fri Apr 27 20:04:34 IST 2018

As duas primeiras linhas redirecionam stdout e stderr respectivamente para os comandos sed que adicionam foo: e foo: (stderr) à entrada.

    
por 27.04.2018 / 16:36
4

Você poderia canalizar a saída por meio de alguma forma de substituir linhas:

some long running stuff | sed -e 's/^/Some said: /;'

Verifique também 24337

Ou apenas direcione saídas separadas para separar arquivos / guias de tela (1) / guias em seu terminal /...

    
por 27.04.2018 / 16:31
0

Uma opção no bash é fazer isso redirecionando para substituições de processos, algo assim:

./script.sh > >(sed 's/^/script: /') 2> >(sed 's/^/script (err): /' >&2)

Isso tem o problema de que a saída pode estar fora de ordem (como Charles Duffy mencionou em um comentário). Também é muito irritante e deselegante. Mas você poderia fazer uma função de wrapper para isso:

prefixwith() {
    local prefix="$1"
    shift
    "$@" > >(sed "s/^/$prefix: /") 2> >(sed "s/^/$prefix (err): /" >&2)
}
prefixwith "From script" ./script.sh

Ou simplifique ainda mais o uso do nome do comando como um prefixo:

prefixoutput() {
    local prefix="From ${1##*/}"
    "$@" > >(sed "s/^/$prefix: /") 2> >(sed "s/^/$prefix (err): /" >&2)
}
prefixoutput ./script.sh
    
por 28.04.2018 / 01:17

Tags