Vejo que muitas perguntas foram feitas e respondidas no SE sobre redirecionamentos no Bash usando exec , mas nenhuma parece responder à minha pergunta.
O que estou tentando realizar é redirecionar toda a saída para stderr em um script para um fd temporário e restaurá-lo de volta para stderr apenas em caso de encerramento malsucedido do script. A capacidade de restaurar o conteúdo de stderr é necessária em caso de encerramento malsucedido, para retornar ao chamador informações sobre o erro. Redirecionar stderr para /dev/nul
descartaria tanto o ruído irrelevante quanto as informações úteis. Tanto quanto possível, arquivos temporários explícitos devem ser evitados, pois eles adicionam vários outros problemas (consulte https://dev.to/philgibbs/avoiding-temporary-files-in-shell-scripts ). O conteúdo de stdoutdevem ser retornados de forma transparente para o chamador. Ele será ignorado em caso de encerramento sem sucesso do script, mas o script não precisa se preocupar com isso.
A razão para fazer isso é que o script é chamado de outro programa que considera qualquer saída para stderr um erro, em vez de testar um código de saída diferente de zero. No exemplo abaixo, openssl envia um indicador de progresso para stderr que deve ser ignorado após a conclusão bem-sucedida.
Abaixo está uma versão simplificada do meu script (observe que o openssl aqui é apenas um espaço reservado para instruções arbitrárias e possivelmente mais complexas):
#!/bin/bash
set -euo pipefail
# Redirect stderr to temp fd 3
exec 3>&2
# In case of error, copy contents of fd 3 to stderr
trap 'cat <&3 >&2' ERR
# Upon exit, restore original stderr and close fd 3
trap 'exec 2>&3 3>&-' EXIT
# This nonetheless outputs the progress indicator to stderr
openssl genpkey -algorithm RSA
Mas obviamente estou perdendo algo, pois o script continua imprimindo o conteúdo de stderr após o término bem-sucedido, mas agora bloqueia em caso de falha. Acho que estou confuso sobre como os redirecionamentos com exec funcionam. O que estou errando?
Obrigado a todos nos comentários acima que ajudaram me apontando na direção certa. Esta parece ser a resposta que eu estava procurando, fortemente inspirada nesta outra resposta do SE :
Idéias para melhorias adicionais são bem-vindas.