Redirecionar a saída de um programa para um arquivo falha

Redirecionar a saída de um programa para um arquivo falha

Então eu tenho um programa, vamos chamá-lo de foo. Estou tentando redirecionar a saída do terminal para um arquivo usando o seguinte comando.

foo > ./someFile.txt

Agora, quando executo esse comando, someFile.txt é criado, mas está vazio. Alguma sugestão sobre como eu poderia redirecionar a saída do terminal?

Responder1

É um comportamento esperado que um arquivo someFile.txtseja criado. Se este arquivo contém alguma coisa ou não, depende do que o seu programa foodeve fazer.

Qualquer que seja o problema que você esteja enfrentando, não parece estar relacionado ao redirecionamento de saída. Você pode tentar o seguinte comando como teste:

cat > someFile.txt

digite qualquer coisa. Tudo o que você digitou será redirecionado para someFile.txt(terminar com ctrl+ d).

A propósito, o arquivo de saída está sendo criado pelo seu shell, não pelo seu programa foo. Mesmo se você digitar um comando inexistente, o arquivo de saída ainda será criado (vazio):

/bin/nonexistent > zzz

Responder2

Outra possibilidade é foousar isattye não gravar nada no stdout se o stdout não apontar para algum lugar interativo.

SINOPSE

#include <unistd.h>
int isatty(int fd);

DESCRIÇÃO A função isatty() testa se fd é um descritor de arquivo aberto referente a um terminal.

Este pequeno programa Python demonstra isso:

import sys, os

if sys.stdout.isatty():
    print "Hello, tty %s" % os.ttyname(1)
else:
    print "stdout: not a typewriter: how boring"

Assim como este pequeno programa em C:

#include <stdio.h>
#include <unistd.h>

int main (void) {
    if ( isatty(stdout) ) {
        printf("Hello, tty %s\n", ttyname(1));
    } else {
        printf("stdout: not a typewriter: how boring\n");
    }
    return 0;
}

Ambos os programas têm o comportamento idêntico:

$ ./isatty > notatty ; cat notatty
stdout: not a typewriter: how boring

$ ./isatty.py
Hello, tty /dev/pts/1

$ ./isatty | cat
stdout: not a typewriter: how boring

Os programas podem escolher como, o que e se devem ou não imprimir com base no fato de estarem sendo redirecionados.

Uma aplicação comum disso é evitar a gravação de sequências de escape ANSI lidas por terminais ( \e[33;1m, etc) para coloração de texto em arquivos, o que parece feio e confunde os analisadores.

Responder3

Eu tive o mesmo problema. O log do meu programa não foi gravado em [stdout] conforme esperado, mas em [stderr]. Um redirecionamento de [stdout] e [stderr] foi, portanto, a solução:

foo >> someFile.txt 2>&1

informação relacionada