Despejos de núcleo de pipe do script

0

Estou fazendo um script de teste para compilar (via make) e executar vários testes. Eu tenho uma série de cat , grep e sed comandos que organiza os resultados de todos os testes bem, no entanto core-dumps são a exceção. Digamos que eu tenha um programa chamado test . Se ./test core for copiado, as linhas a seguir não o pegarão (como não será canalizado para o arquivo):

./test 2>&1 > >(tee log)
./test > log 2>&1

Provavelmente é por causa dessa mensagem de erro do script:

./script.sh: line 53: 4783 Aborted (core dumped) ./test 2>&1 > >(tee log)

Eu tenho uma solução alternativa que faz com que make inicie o programa com uma regra personalizada:

make run-test 2>&1 | tee -a log

Isso funciona atualmente, mas é um pouco hacky ter que usar o makefile para fazer isso. Existe outra maneira de capturar o core-dump sem abortar a linha do script de shell?

    
por Suedocode 15.02.2014 / 00:50

2 respostas

1

Se você deseja executar seu programa test em outro script, deve ser bom o suficiente para capturar a saída desse script. Por exemplo, coloque " ./test " em testscript.sh e, em seguida, diga

./testscript.sh > log 2>&1

Uma solução mais compacta, mas menos intuitiva é

sh -c "./test" > log 2>&1

Ambas as soluções são baseadas no fato de que o shell que executa um programa é o cara que percebe quando o programa despeja o núcleo, e emite a mensagem de erro correspondente. Portanto, para capturar essa mensagem, você deve capturar a saída do shell.

    
por 15.02.2014 / 03:08
2

É o shell que imprime a mensagem em vez do programa com falha. Para capturar a saída do shell também, você quer:

{
./test
} > log 2 >&1

As chaves fazem com que um sub-shell seja executado para executar os comandos internos, e a saída de todo o sub-shell é redirecionada, em vez de apenas um comando.

Como alternativa, se você quiser que toda a saída seja redirecionada para o restante do script, use:

exec > log 2>&1
    
por 15.02.2014 / 04:51