sort "$f1"
falha nos valores $f1
que começam com -
ou aqui, no caso de sort
alguns que começam com +
(podem ter graves consequências para um arquivo chamado, -o/etc/passwd
por exemplo).
sort -- "$f1"
(em que --
sinaliza o final das opções) soluciona 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 dos 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 executado.
Para limpar alguma confusão possível (seguindo os comentários abaixo), isso não impede que o comando entre mmap()
no arquivo ou lseek()
dentro dele (não é o que sort
também faz), desde que o próprio arquivo seja procurável. A única diferença é que o arquivo é aberto mais cedo e no descritor de arquivo 0 pelo shell, em vez de mais tarde pelo comando, possivelmente em um descritor de arquivo diferente. O comando ainda pode buscar / mmap que fd 0 como quiser. Isso não deve ser confundido com o local cat file | cmd
onde cmd
o stdin desta vez é um tubo que não pode ser mapeado / procurado.