Почему некоторые команды не принимают перенаправление ввода?
Короткий ответ: потому что они не были запрограммированы на.
Для программы для чтения из stdin
(это поток, который оболочка подключает к файлу, указанному после <
), не является автоматическим. Это должно быть закодировано программистом. В этом отношении чтение из файлов, указанных в командной строке, также не является автоматическим. То есть содержимое этих файлов, независимо от того, передается ли оно перенаправлением или указывается по имени, волшебным образом не отображается внутри переменных программы без дополнительного кодирования.
Если программа никогда не кодировалась для чтения из потока, не имеет значения, вставили ли вы перенаправление - она просто не будет читать из нее. Согласно спецификации POSIX (http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html), echo
не требуется для чтения из stdin
, а только проверяет аргументы командной строки (и некоторые переменные среды). Чтобы узнать о других программах, вы можете прочитать исходный код, документацию или просто попробовать, как вы сказали :-)
Чтобы ответить на ваш последний вопрос: вы не можете сказать, что команда является интерактивной. Вы можете определить, подключен ли входной поток, из которого он читает, к терминалу (в отличие, например, от простого файла). Есть примеры на многих языках на http://rosettacode.org/wiki/Check_input_device_is_a_terminal. Вы можете представить почтовую программу, которая использует эту функцию, чтобы определить, используется ли она в интерактивном режиме (принимает команды клавиатуры для чтения почты) или неинтерактивно (скажем, для чтения почтового сообщения из файла). Я не уверен, как mail
делает это. (Обратите внимание, что mail
ведет себя по-разному при вызове с аргументами командной строки или без них!)