Why some commands don't take input redirection?
A resposta curta: porque eles não foram programados para.
Para um programa ler stdin
(que é o fluxo que o shell conecta ao arquivo especificado após <
) não é automático. Precisa ser codificado pelo programador. Aliás, a leitura de arquivos fornecidos na linha de comando também não é automática. Ou seja, o conteúdo desses arquivos, seja dado por redirecionamento ou especificado pelo nome, não aparece magicamente dentro das variáveis do programa sem codificação extra.
Se um programa nunca foi codificado para ler a partir de um fluxo, não importa se você colocou um redirecionamento - simplesmente não lerá dele. Por sua especificação POSIX ( link ), echo
não é necessário para ler a partir de stdin
e examina apenas seus argumentos de linha de comando (e algumas variáveis de ambiente). Para descobrir outros programas, você pode ler o código-fonte, a documentação ou simplesmente experimentá-lo como você disse: -)
Para responder à sua última pergunta: você não pode realmente dizer que um comando é interativo. Você pode determinar se o fluxo de entrada do qual está lendo está conectado a um terminal (em oposição a, por exemplo, um arquivo simples). Há exemplos em vários idiomas no link . Você pode conceber um programa de correspondência que use esse recurso para determinar se ele está sendo usado interativamente (aceitando comandos de teclado para ler mensagens) ou não interativamente (por exemplo, para ler uma mensagem de correio de um arquivo). Não tenho certeza de como mail
faz isso. (Observe que mail
se comporta de maneira diferente quando chamado com ou sem argumentos de linha de comando!)