Escrevendo a saída e o fluxo de erro para o mesmo arquivo

2

No Unix / Linux, você pode usar pipes para gravar fluxos de saída e erro em um arquivo. Pode-se até escrevê-los no mesmo arquivo. Existe uma maneira de gravar ambos no arquivo, mas mantendo o pedido. Esta afirmação:

swipl -s jobshop.chr < CHRInput > output 2> output

realmente produz um arquivo chamado "output" com o fluxo de saída e de erro (normalmente essa era a interação do console com o usuário). Mas o fluxo de saída é gravado antes do fluxo de erros (ao trabalhar com um console interativo produzirá fluxos de erro e de saída intercalados).

    
por Willem Van Onsem 05.06.2012 / 03:19

2 respostas

3

Para o bash,

swipl -s jobshop.chr < CHRInput &> output

    
por 05.06.2012 / 03:53
1
swipl -s jobshop.chr < CHRInput > output 2>&1

2>&1 significa "descritor de arquivo de redirecionamento 2 (erro padrão) para o descritor de arquivo 1 (saída padrão) conectado". Observe que 2>&1 tem que vir após o redirecionamento da saída padrão: 2>&1 >output primeiro enviaria fd 2 para qualquer fd 1 conectado no momento (ou seja, o terminal) e redirecionaria fd 1 para o terminal.

Observe que, dependendo de como o programa é gravado, isso pode não intercalar a saída na mesma ordem como se estivesse sendo executado em um terminal. Isso ocorre porque muitos programas armazenam em buffer a saída no stdout, ou seja, eles só gravam dados quando o buffer está cheio. Mas quando a saída padrão é conectada a um terminal, ela é armazenada em buffer de linha, ou seja, cada linha é gravada mesmo se o buffer não estiver cheio. (Stderr, por outro lado, não é armazenado em buffer por padrão). Portanto, se o programa gravar linhas inteiras sem cuidar dos buffers de liberação ou alterar as configurações padrão, você espera que eles sejam gravados no erro padrão ou na saída padrão. , redirecionando para um arquivo pode não funcionar.

Em sistemas Linux razoavelmente recentes, se a saída redirecionada tiver linhas fora de ordem, tente

stdbuf -oL -oL swipl -s jobshop.chr <CHRInput >output 2>&1
    
por 06.06.2012 / 00:19