Su pregunta está estrechamente relacionada con cómo el shell que está utilizando analiza la entrada del usuario en la línea de comando.
Si la primera palabra en la línea de comando es un programa, ubicado en una carpeta especial (en su mayoría definida por PATH
) y no se dan más caracteres especiales (depende del shell que esté usando), todas las palabras posteriores separadas por espacios o pestañas se pasan a el programa en una forma especial, es decir, una matriz. Con cada palabra como un elemento en la matriz.
La forma en que el programa que va a invocar interpreta los argumentos (ubicados en la matriz) depende de cómo esté programado. Existen algunos estándares cuasi de cómo debería ser la sintaxis de los argumentos, pero en general el programador es completamente libre. Por lo tanto, el primer argumento puede interpretarse como el nombre de un archivo o lo que sea que el programador haya pensado en el momento en que escribió el programa.
En el caso de agregar el carácter especial <
o >
con la línea de comandos, los comandos -a cáscara dosn't <
y >
ni palabras posteriores a la matriz que se pasa al programa. Con <
o >
dado, el shell comienza a hacer cosas elegantes, respaldadas por el núcleo subyacente ( canalización de palabras clave ). Para comprender lo que está sucediendo, debe comprender qué son STDIN
y STDOUT
(dado que no está inmediatamente relacionado, lo omito STDERR
).
Todo lo visible que ve en su terminal (en la mayoría de los casos, una parte de su pantalla) está escrito por el shell o cualquier otro programa que haya invocado previamente a un archivo especial (en Unix todo es un archivo ). Este archivo tiene una identificación especial y se llama STDOUT
. Si un programa quiere leer datos del teclado, no sondea el teclado directamente (al menos en la mayoría de los casos) sino que lee desde un archivo especial llamado STDIN
. Internamente, este archivo está conectado a su dispositivo de entrada estándar, su teclado en la mayoría de los casos.
Si el shell lee <
o >
en una línea de comando analizada, manipula STDIN
o STDOUT
de un tipo particular durante el tiempo que se ejecuta el programa correspondiente. STDIN
y dos ya STDOUT
no apuntan a la terminal o al dispositivo de entrada estándar, sino al nombre de archivo posterior en la línea de comando.
En el caso de las dos líneas
cat file_name
cat < file_name
el comportamiento observado es idéntico porque el desarrollador correspondiente hace cat
leer STDIN
o leer los datos del archivo, cuyo nombre se da como el primer argumento de línea de comando (que es el primer elemento en la matriz a la que pasa el shell cat
). Posteriormente cat
escribe todo el contenido de file_name
o STDIN
en la terminal ya que no le indicamos al shell que manipule STDOUT
. Recuerde que en la segunda línea su shell manipula STDIN
de esta manera, que ya no apunta a su dispositivo de entrada estándar sino que apunta a un archivo llamado file_name
en su directorio de trabajo actual.
En el otro caso de la línea
man < file_name
man
no está destinado a leer nada STDIN
si se llama sin argumento, es decir, una matriz vacía. Entonces la linea
man < file_name
es igual
man
Por ejemplo, man
también leerá algo STDIN
si pasa -l -
a man
. Con esta opción en la línea de comando, puede mostrar el contenido de cualquier cosa que se man
lea STDIN
en su terminal. Entonces
man -l - < file_name
también funcionaría (pero tenga cuidado, man
no solo es un buscapersonas, sino que también analiza la entrada del archivo y, por lo tanto, el contenido del archivo y el contenido mostrado podrían diferir).
Entonces STDIN
, cómo STDOUT
y los argumentos de la línea de comandos son interpretados, todo depende del desarrollador correspondiente.
Espero que mi respuesta pueda aclarar las cosas.
man -l - < file_name
para hacerman
interpretacionesSTDIN
como argumentos, pero falla en mi sistema conSTDERR
:man -l - < tee man: invalid option -- l man, version 1.6c