
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.txt
seja criado. Se este arquivo contém alguma coisa ou não, depende do que o seu programa foo
deve 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 é foo
usar isatty
e 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