¿Qué hace un <desnudo?

10

bash no parece quejarse si ejecuta un comando como

$ < some-file-that-exists

Nada parece suceder.

También podrías usar

$ <<<"any string"

e incluso la sustitución de procesos.

Entonces, ¿qué hace exactamente esto y por qué está permitido? ¿Podría ser útil para algo?

Píldoras de explosión
fuente
Por cierto: para el gran ZSH, "<foobar" es lo mismo que "less foobar", ya que tu foobar de redireccionamiento al shell. Creo que este es un comportamiento bastante intuitivo. Un desnudo <le dará un error ( zsh: parse error near `\n') ya que no se da ningún argumento.
matemáticas
@math obtendrá un error similar bash, pero eso es interesante less.
Píldoras de explosión

Respuestas:

20

<configura la redirección para un comando que puede ocurrir antes o después de las instrucciones de redirección. Es decir

$ < file wc

funciona tan bien como

$ wc < file

Pero si no das un comando, bash configura la redirección y no hace nada más. Para la redirección de entrada, esto equivale a lo que vio, nada, si el archivo existe y es legible. Si el archivo no existe o no es legible, bash indicará un error. Para la redirección de salida, el archivo de salida se creará si no existe. Cualquier archivo de salida existente se truncará si >se usa; sin truncamiento si >>se usa.

Kyle Jones
fuente
en otras palabras, son existe una concisa y crean
trinquete monstruo
@Kyle Jones Creo que no coinciden los dos operadores en la última oración.
jamesbtate
@Puddingfox Gracias. He editado la frase final al final para aclarar.
Kyle Jones el
¿Hay alguna razón para usar < file wcvs. wc < file?
Píldoras de explosión
1
@tandu Es útil cuando se utilizan shells interactivos. Supongamos que tiene un comando que utiliza la redirección y desea repetirlo con un último argumento diferente. Si la redirección está al comienzo de la línea, es fácil escribir control-P y luego editar el último argumento sin tener que saltear el lenguaje "<foo> bar 2> & 1" como lo haría si estuviera al final. Más allá de eso, no he encontrado uso para eso.
Kyle Jones el
5

<lee de stdin por defecto, o un archivo. su expresión no hace nada con la entrada porque no hizo nada después de leer.

si al final termina el archivo de salida <some-file-that-exist>, verá que acaba de leer el contenido del primer archivo y lo escribió en el segundo archivo.

<<< está aquí en formato doc, por lo que se lee desde una cadena en lugar de un archivo. gato <<< "cualquier cadena" para ver lo que has leído.

johnshen64
fuente
2
para referencia futura, edite su respuesta para agregar detalles en lugar de agregar un comentario
Nate Koppenhaver
2
"si al final finaliza el archivo de salida <algún archivo que existe>, verá que acaba de leer el contenido del primer archivo y lo escribió en el segundo". Esto está mal; sin un comando, el archivo de salida se truncará a cero bytes.
Kyle Jones