Como saber se a saída está sendo redirecionada para um arquivo? [duplicado]

2

Estou trabalhando na exibição de saída como o comando ls (apenas ls, sem opções). E eu tenho um programa de trabalho usando as chamadas do sistema. Mas experimentei um comportamento estranho durante o teste, conforme mostrado abaixo.

$ ls 
a b c
$ ls > somefile
$ cat somefile
a
b
c

então, como você vê, a saída é escrita em um arquivo por arquivo, NENHUM SWITCH ADICIONAL FOI DADO AO LS. Você pode testá-lo. Portanto, inferimos que o comando ls possui alguma lógica interna para exibi-la uma por linha, se gravada em um arquivo por meio de redirecionamento.

Para adicionar ao quebra-cabeça, acredito que seja o shell que interpreta o redirecionamento.

Então estou confuso Eu gostaria de saber exatamente o que está fazendo a saída de um por linha se redirecionado para um arquivo? Alguma dica?

    
por mtk 02.09.2015 / 17:48

1 resposta

2

Geralmente, testando se um filehandle relevante é anexado a um tty:

% perl -le 'print -t STDOUT ? "yes" : "no"'
yes
% perl -le 'print -t STDOUT ? "yes" : "no"' > out
% < out
no
% 

Ou via C, algo como:

#include <sys/ioctl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

...

int foo;
if (ioctl(STDIN_FILENO, FIONREAD, &foo) == -1) {
    printf("yes\n");
} else {
    printf("no\n");
}
    
por 02.09.2015 / 17:54