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.