sort "$f1"
falha para valores de $f1 que começam com - ou aqui para o caso de sort alguns que começam com + (podem ter consequências graves para um arquivo chamado -o/etc/passwd , por exemplo).
sort -- "$f1"
(onde -- sinaliza o fim das opções) aborda a maioria desses problemas, mas ainda falha no arquivo chamado - (que sort interpreta como significando seu stdin).
sort < "$f1"
Não tem esses problemas.
Aqui, é o shell que abre o arquivo. Isso também significa que, se o arquivo não puder ser aberto, você também receberá uma mensagem de erro potencialmente mais útil (por exemplo, a maioria das shells indicará o número da linha no script) e a mensagem de erro será consistente se você usar redirecionamentos sempre que possível para abrir arquivos.
E em
sort < "$f1" > out
(ao contrário de sort -- "$f1" > out ), se "$f1" não puder ser aberto, out não será criado / truncado e sort nem será executado.
Para eliminar alguma possível confusão (seguindo os comentários abaixo), isso não impede que o comando mmap() ing do arquivo ou lseek() ing dentro dele (não que sort faça isso) desde que o próprio arquivo seja procurado. A única diferença é que o arquivo é aberto anteriormente e no descritor de arquivo 0 pelo shell, em vez de posteriormente pelo comando, possivelmente em um descritor de arquivo diferente. O comando ainda pode procurar / mmap que fd 0 como agrada. Isso não deve ser confundido com cat file | cmd , onde esse tempo cmd 's stdin é um pipe que não pode ser mmaped / seeked.