Como usar o comando tee com echo conforme o requisito abaixo?

0

Anexar uma variável que contém o comando tee e o nome do arquivo de log, não obtendo o resultado esperado, pois echo está imprimindo o conteúdo da variável.

Abaixo está o conteúdo do arquivo, a saída real e o resultado esperado.

Conteúdo do script de shell:

#!/bin/bash

log="2>&1 | tee -a report.txt"

echo ""
echo '***************-:START OF THE REPORT:-***********' $log

Depois de executar o script.

console op:
***************-:START OF THE REPORT:-*********** 2>&1 | tee -a report.txt

esperado -

console op:
***************-:START OF THE REPORT:-***********

report.txt file content:
***************-:START OF THE REPORT:-***********

Observe também que a variável $log deve conter o comando tee e o nome do arquivo, já que não quero codificar o comando tee no final de cada comando echo.

    
por Prashant BJ 09.09.2017 / 14:11

3 respostas

4

Eu estou supondo que você gostaria de usar essa maneira incomum de marcar o pipe real e tee no final da mensagem de log porque você não quer ter que canalizar cada echo

Bem, você pode fazer isso também:

logfile='report.txt'

log () {
    if [ -z "$1" ]; then
        tee -a "$logfile"
    else
        printf '%s\n' "$@" | tee -a "$logfile"
    fi
}

log "some message"
log "some other message"
log "multi" "line" "output"

{
    cat <<LETTER
Dear Sir,

It has come to my attention, that a whole slew of things may be
collected and sent to the same destination, just by using a single
pipe. Just use { ... } | destination

Sincerely, $LOGNAME
LETTER

    cat <<THE_PS
PS.
Here's the output of "ls -l":
THE_PS

    ls -l

    echo "LOL"

} | log

Ou seja, coloque o comando awkward tee em uma função simples do shell cujo nome é fácil de digitar e apenas canalize a saída para ele.

Neste exemplo, a função log usa printf para gerar os dados dados em sua linha de comando, ou alterna para a leitura da entrada padrão se estes não forem argumentos de linha de comando.

Você pode até usar

./your_original_script_without_special_logging 2>&1 | log
    
por 09.09.2017 / 14:41
1

Você deve realmente usar uma função mascarando o comando echo para isso:

echo ()
{
    builtin echo "$@" | tee -a report.txt
}

Então você pode fazer:

echo ""
echo '***************-:START OF THE REPORT:-***********'

Sem ter que codificar tee ou qualquer outra coisa no final dos comandos echo .

    
por 09.09.2017 / 14:44
0

Como você está usando o

echo '***************-:START OF THE REPORT:-***********' $log
A linha

apenas ecoa o conteúdo de $log para a linha de comando, não agindo como se você fosse inserir essa linha em um console.

Para fazer com que a linha atue como você espera, você pode ou usar eval .

eval echo '***************-:START OF THE REPORT:-***********' $log
    
por 09.09.2017 / 14:33