Como posso pegar um código de saída de comando para mais tarde, em um Makefile?

5

Eu tenho um makefile, com um destino de conjunto de testes, assim:

rcheck:
        foo

Isso mostra a saída do comando foo no stdout e retorna um código de saída de foo , que é manipulado pelo make como normal.

Eu quero adicionar algo a esse destino, para analisar a saída de foo sem afetar o comportamento existente - ou seja:

  1. O stdout / stderr de foo deve ser exibido em stdout / stderr, como antes
  2. o resultado final do destino do rcheck, no que diz respeito ao Make, é o código de saída do foo
  3. stdout de foo deve ser passado para um segundo comando, bar , de alguma forma. O código de saída de bar não importa, e bar não deve produzir nada para stdout ou stderr além de 1. acima (a menos que a solução signifique que bar lida com ele mesmo)

Qual é a melhor solução aqui?

    
por directhex 11.02.2015 / 20:10

2 respostas

1

Se você não está preocupado com o tempo que os dados passam de "foo to bar", e você está bem com um arquivo temporário que precisa ser manipulado no seu alvo limpo, simplesmente:

rcheck:
        foo | tee sometempfile
        -bar < sometempfile >/dev/null 2>/dev/null

Se, por outro lado, você se importar muito com o timing, poderá fazer com que a barra repita sua entrada para stdout e tente algo como:

rcheck:
        -(foo; echo $$? > sometempfile) | bar
        exit $(cat sometempfile)

Tenho certeza de que haverá maneiras mais limpas, mas o texto acima veio à mente. (Nota, ambos não foram testados)

    
por 11.02.2015 / 21:49
0

Se você estiver usando um shell que suporta a opção pipefail (bash, ksh e zsh do), você pode fazer desta maneira:

rcheck:
    set -o pipefail; foo | tee /dev/stderr | { bar >/dev/null 2>&1; true; }

Minha página de manual do ksh documenta essa opção como:

pipefail
      A pipeline will not complete until all components of the pipeline have
      completed, and the return value will be the value of the last non-zero
      command to fail or zero if no command has failed.

Em oposição ao comportamento padrão:

The exit status of a pipeline is the exit status of the last command
unless the pipefail option is enabled.
    
por 11.02.2015 / 22:17