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
man
( man-db ) lee argumentosSTDIN
con los argumentos dados-l
seguidos de-
. Simplemente interpreta los datosSTDIN
como una página de manual. Para obtener explicaciones más detalladas de los argumentos válidos y cómo se interpretan, debe consultar la página del manual del programa relacionado. En su caso consultarman man
. Tal vez hay una opción similar para suman
. Si desea leer los argumentos de la línea de comandos para un programa específicoSTDIN
xargs
(como se mencionó anteriormente), este es el camino a seguir.man man
y encontrar el que está en mi sistema operativo no lo admite. De todos modos, gracias por esta declaración de estos dos conceptos para mí.Son completamente diferentes. Los argumentos de la línea de comandos se pasan al programa en una matriz y puede hacer lo que quiera con ellos; stdin es un flujo de entrada del que el programa debe solicitar datos Los programas que procesan archivos a menudo eligen admitir ambos, pero tienen que hacerlo manualmente: comprueban si se pasó un nombre de archivo como argumento de línea de comando y, si no, leen de stdin.
Parece que espera
man
leer stdin para encontrar la página de manual que debería mostrar, lo cual sería un comportamiento realmente extraño; ¿Cuándo usarías eso? El hecho de quecat
muestre su stdin es un hecho del hecho de que no hace nada más; No creo que ninguna otra herramienta funcione de esa manera. Por ejemplo,grep
puede tomar un nombre de archivo o leerstdin
, pero procesa los datosstdin
, no lee un nombre de archivostdin
y luego lo abreSi realmente necesita este comportamiento, puede usarlo
xargs
, que convierte un archivo en argumentos de línea de comandos:O simplemente inserte una
cat
llamada dentro de laman
llamada:fuente
man $(<file_name)
.(<>)
en un bucle serviráSTDIN
o los argumentos de la línea de comandos como nombres de archivo ...man < file_name
es ayudarme a comprender estos dos conceptos. Leyendo su explicación, la implementación la decide el autor del comando. Entonces, si estoy debajo de la derecha, lafind
toma de argumentos procesa STDIN