Quando um script é executado, os comandos nele podem enviar algum texto para stdout/stderr. O próprio Bash também pode produzir algum texto.
Mas se alguns scripts estiverem rodando ao mesmo tempo, fica difícil identificar de onde vem o erro.
Então é possível inserir um prefixo em todas as saídas do script? Algo como:
#!/bin/bash
prefix 'PREFIX' &2
echo "wrong!" >&2
Então:
$ ./script.sh
PREFIXwrong!
Você pode redirecionar stderr/stdout para uma substituição de processo que adiciona o prefixo de sua escolha. Por exemplo, este script:
Produz esta saída:
As duas primeiras linhas redirecionam stdout e stderr, respectivamente, para comandos sed que adicionam
foo:
efoo: (stderr)
à entrada.As chamadas para o comando interno do shell
trap
garantem que o subshell não saia ao encerrar o script comCtrl+C
ou ao enviar oSIGTERM
sinal usandokill $pid
. Isso garante que seu shell não encerrará seu script à força porque ostdout
descritor de arquivo desaparece quandosed
sai porque também recebeu o sinal de encerramento. Efetivamente, você ainda pode usar traps de saída em seu script principal esed
ainda estará em execução para processar qualquer saída gerada durante a execução de suas traps de saída. O subshell ainda deve sair após o término do script principal, para que osed
processo não fique em execução para sempre.Você pode canalizar a saída por meio de alguma forma de substituição de linhas:
Consulte também 24337
Ou apenas direcionar saídas separadas para separar arquivos/tela(1) abas/abas em seu terminal/...
Uma opção no bash é fazer isso redirecionando para processar substituições, algo assim:
Isso tem o problema de que a saída pode estar fora de ordem (como Charles Duffy mencionou em um comentário). Também é irritantemente desajeitado. Mas você pode criar uma função wrapper para isso:
Ou simplifique ainda mais fazendo com que ele use o nome do comando como prefixo: