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