Votre question est étroitement liée à la façon dont le shell que vous utilisez analyse les entrées utilisateur sur la ligne de commande.
Si le premier mot de la ligne de commande est un programme, situé dans un dossier spécial (principalement défini par PATH ) et qu'aucun autre caractère spécial n'est donné (en fonction du shell que vous utilisez), tous les mots suivants séparés par des espaces ou des tabulations sont passés à le programme sous une forme spéciale, à savoir un tableau. Avec chaque mot comme un élément du tableau.
La façon dont le programme que vous allez invoquer interprète les arguments (situés dans le tableau) dépend de la façon dont il est programmé. Il y a des quasi normes sur la façon dont la syntaxe des arguments devrait ressembler, mais en général le programmeur est entièrement libre. Ainsi, le premier argument peut être interprété comme le nom d'un fichier ou quoi que pense le programmeur au moment où il a écrit le programme.
Dans le cas où vous ajoutez le caractère spécial <ou >à votre ligne de commande, le shell ne s'ajoute pas <et >ni les mots suivants au tableau qui seront passés au programme. Avec <ou >étant donné le shell commence à faire des choses fantaisistes, supporté par le noyau sous-jacent (mot-clé piping ). Pour comprendre ce qui se passe, vous devez comprendre quoi STDINet STDOUT(comme ce n'est pas immédiatement lié, j'ometSTDERR ) sont.
Tout ce que vous voyez sur votre terminal (dans la plupart des cas une partie de votre affichage) est écrit par le shell ou tout autre programme que vous avez appelé précédemment dans un fichier spécial (sous Unix, tout est un fichier ). Ce fichier a un identifiant spécial et est appelé STDOUT. Si un programme veut lire des données à partir du clavier, il n'interroge pas directement le clavier (au moins dans la plupart des cas) mais lit à partir d'un fichier spécial appelé STDIN. En interne, ce fichier est connecté à votre périphérique d'entrée standard, votre clavier dans la plupart des cas.
Si le shell lit <ou >dans une ligne de commande analysée, il manipule STDINou STDOUTdans un type particulier pendant la durée d'exécution du programme correspondant. STDINet STDOUTne pointe plus vers le terminal ou le périphérique d'entrée standard, mais plutôt vers le nom de fichier suivant sur la ligne de commande.
Dans le cas des deux lignes
cat file_name
cat < file_name
le comportement observé est identique car le développeur correspondant fait catpour lire STDINou lire les données du fichier, dont le nom est donné comme premier argument de ligne de commande (qui est le premier élément du tableau vers lequel le shell passe cat). Écrit ensuite cattout le contenu de file_nameou STDINvers le terminal car nous n'instruisons pas le shell à manipuler STDOUT. N'oubliez pas que dans la deuxième ligne, votre shell manipule STDINde cette manière, qu'il ne pointe plus vers votre périphérique d'entrée standard mais pointe vers un fichier appelé file_namedans votre répertoire de travail actuel.
Dans l'autre cas de la ligne
man < file_name
mann'est pas censé lire quoi STDINque ce soit s'il est appelé sans argument, c'est-à-dire un tableau vide. Donc la ligne
man < file_name
équivaut à
man
Par exemple man, lira quelque chose STDIN, aussi si vous passez -l -à man. Avec cette option donnée sur la ligne de commande, vous pouvez afficher le contenu de tout ce qui se manlit STDINsur votre terminal. Donc
man -l - < file_name
fonctionnerait également (mais attention, ce mann'est pas seulement un pager, mais il analyse également l'entrée du fichier et le contenu du fichier et le contenu affiché peuvent différer).
Alors, comment STDIN, STDOUTet les arguments de ligne de commande sont interprétés dépend du développeur correspondant.
J'espère que ma réponse éclaircira les choses.
man -l - < file_namepour faire desmaninterprètesSTDINcomme arguments, mais cela échoue dans mon système avecSTDERR:man -l - < tee man: invalid option -- l man, version 1.6c