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.