Warum benötigen manche Befehle keine Eingabeumleitung?
Die kurze Antwort: weil sie nicht programmiert waren.
Für ein Programm, aus dem gelesen werden soll stdin
(dh der Stream, mit dem die Shell eine Verbindung mit der danach angegebenen Datei herstellt <
), ist nicht automatisch. Es muss vom Programmierer codiert werden. Das Lesen von Dateien, die in der Befehlszeile angegeben sind, erfolgt ebenfalls nicht automatisch. Das heißt, der Inhalt dieser Dateien, egal ob durch Umleitung oder durch Namen angegeben, erscheint nicht magisch in den Programmvariablen ohne zusätzliche Codierung.
Wenn ein Programm nie zum Lesen aus einem Stream codiert wurde, ist es unerheblich, ob Sie eine Umleitung angeben - es wird einfach nicht gelesen. Nach seiner POSIX-Spezifikation ( http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html ) muss echo
nicht gelesen werden, sondern stdin
nur die Befehlszeilenargumente (und einige Umgebungsvariablen). Für andere Programme können Sie den Quellcode und die Dokumentation lesen oder einfach wie gesagt ausprobieren :-)
Um Ihre letzte Frage zu beantworten: Sie können nicht wirklich sagen, dass ein Befehl interaktiv ist. Sie können bestimmen, ob der Eingabestrom, von dem er liest, mit einem Terminal verbunden ist (im Gegensatz zu einer einfachen Datei). Es gibt Beispiele in vielen Sprachen unter http://rosettacode.org/wiki/Check_input_device_is_a_terminal . Sie könnten sich ein Mailing-Programm vorstellen, das diese Funktion verwendet, um zu bestimmen, ob es interaktiv verwendet wird (Tastaturbefehle zum Lesen von E-Mails akzeptieren) oder nicht interaktiv (z. B. zum Lesen einer E-Mail-Nachricht aus einer Datei). Ich bin nicht sicher, wie mail
es geht. (Beachten Sie, dass mail
sich das Verhalten bei Aufruf mit oder ohne Befehlszeilenargument anders verhält!)