Como escrever uma função que grava tanto no console quanto no arquivo de log?

2

Gostaria de escrever uma função que grava uma mensagem para o console e o arquivo de log. Minha tentativa inicial foi essa:

function log_write {
    local message=$1
    local log_file=$2
    echo "${message}" | tee -a ${log_file}
}

Mas isso não funciona - acho que porque echo em um contexto de função significa 'retornar um valor', não escrever no console. O que eu perdi? Eu invoco isso assim no meu script:

message='something interesting happened'
log_file='my_script.log'
$(log_write $message $log_file)

Além disso, eu o executo no Windows via porta msysgit, mas dobro o problema.

    
por chester89 02.01.2015 / 16:30

1 resposta

5

A sintaxe substituição de comandos é o problema aqui:

$(log_write $message $log_file)

Isso invoca a função e retorna a saída, pronta para ser capturada em uma variável. No entanto, você não está fazendo isso.

Em vez disso, você quer invocar sua função como qualquer outro comando:

log_write "$message" "$log_file"

Observe as aspas: elas são cruciais para manter as mensagens com várias palavras como um único argumento. Caso contrário, se você fizer isso:

message="hello world"
log_write $message $log_file

Depois, você receberá a palavra "hello" escrita no arquivo "world". Isso acontece devido a divisão de palavras depois que a variável é expandida. Regra de ouro: sempre cite suas variáveis, exceto quando você deseja explicitamente a divisão de palavras e expansão de nome de arquivo efeitos de omitir as aspas. Há também implicações de segurança na omissão de cotações

    
por 02.01.2015 / 17:13

Tags