Os programas do tipo Unix são capazes de determinar para onde está indo sua saída?

Os programas do tipo Unix são capazes de determinar para onde está indo sua saída?

Até recentemente, eu tinha a impressão de que os programas Unix-y não sabiam para onde ia sua saída, seja para padronização, redirecionamento para um arquivo ou para um canal. No entanto, uma pergunta U&L não relacionada neste site chamou minha atenção para o seguinte exemplo:

% echo "hello world" > file

% grep --color=auto lo file
hello world

% grep --color=auto lo file | cat
hello world

Obviamente você não pode ver aqui, mas o primeiro comando mostra 'lo' destacado, como esperado. Porém, a segunda chamada, que passa por um cano, não apresenta cor. Isso sugere que ele grepestava ciente de que sua saída estava sendo direcionada para um tubo e evitou emitir cor. Como isso é feito?

Responder1

É possível determinar se um descritor de arquivo se refere a um tty.

Confiraa isattyfunção.

Alternativamente, você pode usara fstatfunçãoque fornece um conjunto de informações sobre o arquivo.

Responder2

Sim, eles estão. Existem vários métodos para determinar para onde está indo a saída. Paracomparação, veja minha resposta a uma pergunta relacionada no stackoverflow.

Responder3

Facilmente. Diferentes maneiras podem ser usadas para determinar para onde a saída está indo. Então, em python você poderia fazer algo como

    /* CODE. Input will be parsed and executed */
int
PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit,
                     PyCompilerFlags *flags)
       {
    if (filename == NULL)
        filename = "???";
    if (Py_FdIsInteractive(fp, filename)) {
        int err = PyRun_InteractiveLoopFlags(fp, filename, flags);

informação relacionada