Detectar se o stdout é redirecionado para um canal (não para um arquivo, dispositivo de caractere, terminal ou soquete)?

Idealmente, isso poderia ser script em shell, mas Perl ou Python seria bom. O código C pode ser útil, mas provavelmente falha no custo / benefício.

Reconheço que o redirecionamento para um FIFO (pipe nomeado) pode ser indistinguível de um pipe real, e isso é suficiente para que eu realmente não me importe.

Soluções estritas de POSIX são as melhores, independentes de variantes do UNIX / Linux são as próximas melhores, mas pelo menos algo que funciona no Darwin (MacOS X) é o que eu preciso agora.

Antes de escrever sua resposta -Eu já sei sobretest -t - que me dirá se stdout é um terminal (nesse caso, definitivamente não é um canal) - mas não me dirá se o stdout foi redirecionado para um arquivo, dispositivo de caractere não terminal ou soquete de domínio UNIX em vez de um tubo.

Caso de uso pretendido: Eu tenho um comando que deve ser executado dentro de aspas no shell, para que ele possa gerar comandos que definem variáveis de ambiente. Gostaria que o comando abortasse com um erro se stdout não for redirecionado para um canal, pois nesse caso definitivamente não foi invocado poreval `mycommand`;.

Se houver alguma variável de ambiente especial que um shell definirá ao executar um comando entre aspas, isso seria útil, mas como é provável que seja específico ao bash, zsh ou algo assim, a detecção de pipe é mais importante.

questionAnswers(5)

yourAnswerToTheQuestion