sort "$f1"
falla para los valores $f1
que comienzan con -
o aquí para el caso de sort
algunos que comienzan con +
(puede tener graves consecuencias para un archivo llamado, -o/etc/passwd
por ejemplo).
sort -- "$f1"
(donde --
señala el final de las opciones) aborda la mayoría de esos problemas pero aún falla para el archivo llamado -
(que sort
en su lugar interpreta que significa su stdin).
sort < "$f1"
No tiene esos problemas.
Aquí, es el shell que abre el archivo. También significa que si el archivo no se puede abrir, también recibirá un mensaje de error potencialmente más útil (por ejemplo, la mayoría de los shells indicarán el número de línea en el script), y el mensaje de error será coherente si usa redirecciones siempre que sea posible para abrir archivos.
Y en
sort < "$f1" > out
(al contrario de sort -- "$f1" > out
), si "$f1"
no se puede abrir, out
no se creará / truncará y sort
ni siquiera se ejecutará.
Para aclarar alguna posible confusión (siguiendo los comentarios a continuación), eso no impide que el comando mmap()
ingrese el archivo o lo lseek()
contenga dentro (no lo sort
hace tampoco) siempre que el archivo en sí sea buscable. La única diferencia es que el archivo se abre antes y en el descriptor de archivo 0 por el shell en lugar de más tarde por el comando posiblemente en un descriptor de archivo diferente. El comando aún puede buscar / mmap que fd 0 como le plazca. Eso no debe confundirse con el lugar cat file | cmd
donde cmd
el stdin de esta vez es una tubería que no puede mapearse / buscarse.