Estou convertendo um script de bash para zsh e estou me debatendo há dias com a saída. Eu quero que o stdout e o stderr vão para o console e para um arquivo de log. Eu tentei de tudo que posso encontrar online, mas sem alegria. Eu li a seção de redirecionamento do manual do zsh, mas não encontrei nada que ajudasse, embora deva admitir que não está claro para mim.
Aqui estão as coisas que tentei perto do início do script, experimentalmente, e seus resultados:
exec 2>&1 | tee -i test.log # everything in console, log created but empty
exec 2>&1 | tee -i > test.log # everything in console, log created but empty
exec 1>>$LOG; exec 2>&1 # everything in log, none in console
exec 2>&1; exec 1>>$LOG # console gets errors only; log stdout only
exec &> >(tee "$LOG") # works in bash, error in zsh
exec > >(tee -i ${LOG?}) 2>&1 # error
exec |& tee $LOG # error
exec > >(tee $LOG) 2>&1 # error
Eu também tentei entender os multios da opção zsh, mas não consegui entender muito. Deveria estar ativado por padrão, mas não o encontro na lista de opções quando executo setopt
. Nem quando corro setopt multios
. Quando corro unsetopt multios
, vejo a opção nomultios
, mas isso não parece ajudar
Entendo que perguntas semelhantes foram feitas e respondidas, mas as respostas estão principalmente na lista acima e não funcionaram para mim.
Não acho que seja relevante, mas também configurei um log de depuração que obtém o descritor de arquivo 3. É apenas para linhas de saída de depuração que terminam com >&3.
Observação para quem procura essa solução: os testes executivos acima foram feitos com um shebang confuso e os resultados com isso corrigido foram um pouco diferentes. Além da solução de Gairfowl, abaixo, também funcionou:
exec > >(tee $LOG) 2>&1