Não consigo explicar o comportamento que você está enfrentando, mas aqui está uma possível correção:
#!/bin/bash mylog() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" } mymain() { ( mylog 'start' some-command || mylog 'error' && return 1 mylog 'end' ) >> /var/log/my-log.log 2>&1 } mymain
Como alternativa, remova o redirecionamento da definição da função mymain
e coloque-o na chamada de função mymain
:
mymain >> /var/log/my-log.log 2>&1
(Você também deve excluir os parênteses da definição da função mymain
.) Como alternativa, como você deseja que o E / S seja redirecionado para o script inteiro , pode interromper o redirecionamento além das declarações de ação:
exec >> /var/log/my-log.log exec 2>&1 mymain
Como não entendo por que sua abordagem está falhando, não consigo explicar por que é mais provável que qualquer um dos itens acima funcione conforme desejado. No entanto, são maneiras ligeiramente diferentes de fazer a mesma coisa, e isso pode ser suficiente. By the way, eu mudei 'date …'
para $(date …)
apenas por razões gerais;
Eu não acredito que tenha algo a ver com o seu problema.