Estou tentando organizar os seguintes trechos, os objetivos de design são registrar toda a saída de um script e não devem ser um invólucro. Menos linhas são melhores.
Não ligo para as entradas do usuário (neste estágio), os scripts de destino são executados de maneira não interativa.
O trecho precisa
- stdout de saída para log e sempre ecoa no console
- stderr de saída para log e eco no console se a depuração estiver ativada
- As mensagens stderr devem ser prefixadas com carimbos de data e hora e outras utilidades
No momento, tenho o seguinte, que só é testado em versões recentes do bash (4.2+?), Como no Ubuntu, precisas, mas se comporta mal no CentOS6.
DEBUG_LOG="${0##*/}.log"
# copy stdout to log always and echo to console
exec > >(tee -a ${DEBUG_LOG})
# copy stderr to log only, unless debugging is enabled
[ $DEBUG_TEST = "true" ] \
&& exec 2> >(tee -a ${DEBUG_LOG} >&2) \
|| exec 2>> ${DEBUG_LOG}
Então isso...
# Expand escaped characters, wrap at 70 chars on spaces,
# and indent wrapped lines
msg_log() {
echo -e "$(date +%T) ${0##*/}: $1" \
| fold -w70 -s | sed '2~1s/^/ /' >&2;
}
msg_con() {
if [ "${DEBUG_TEST}" = "true" ]; then
msg_log "$1"
else
echo -e "$1" | fold -w70 -s | sed '2~1s/^/ /';
fi
}
Em vez de echo
eu posso chamar um desses procedimentos de msg, por exemplo msg_con "hello world"
,.
Além disso, a saída do script irá para o stderr configurando como uma variável de ambiente no momento da chamada, por exemplo DEBUG_TEST=true myscript
,.
Eu li que o exec pode não funcionar em alguns shells, como o busybox. Existe uma combinação mkfifo e fork em https://stackoverflow.com/a/5200754 que faz algo semelhante, mas eu prefiro não usar fork, a menos que seja absolutamente necessário.
Prefira exemplos do bash, por favor, mas algo que funcione em sh ou seja mais portátil seria bom. Alguma ideia?
fonte
exec > filename
deve funcionar no sh e, na verdade, funciona no busybox v1.15.3 (novembro de 2011). Mas a substituição do processo não>(command)
é portável, pois é a extensão do bash. Apenas evite usá-lo em scripts. Por que>>
não é suficiente para você?Outra solução é especificar o redirecionamento fora dos seus scripts. Quando seu script é chamado em segundo plano (por cron, ou script do sistema etc.), eles devem ser chamados assim
Quando você chama o script manualmente e deseja ver a saída, basta chamá-lo sem redirecionamentos.
fonte
Esses dois exemplos farão quais são seus objetivos declarados
ou
fonte
Você pode usar o
tee
comando ouscript
comando, ambos são realmente úteis.fonte