Почему некоторые команды не принимают перенаправление ввода?
Короткий ответ: потому что они не были запрограммированы на.
Для программы для чтения 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
ведет себя по-разному при вызове с или без аргументов командной строки!)