Por que é 'sort' $ f1 '' preferido sobre 'sort -' $ f1 '', e por que isso é preferível ao invés de 'sort' $ f1 ''?

28

De link

Remember to use -- when passing arbitrary arguments to commands (or use redirections where possible). So sort -- "$f1" or better sort < "$f1" instead of sort "$f1".

Por que é preferível usar -- e redirecionamento?

Por que sort < "$f1" é preferido em relação a sort -- "$f1" ?

Por que sort -- "$f1" é preferido em relação a sort "$f1" ?

Obrigado.

    
por Tim 25.07.2018 / 07:26

2 respostas

53
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.

    
por 25.07.2018 / 08:01
17

O problema são nomes de arquivos que começam com um traço. sort "$f1" não funciona se o valor de f1 começar com - porque o comando interpretará o valor como uma opção. Isso geralmente resulta em um erro, mas pode até mesmo causam um buraco de segurança . Com sort -- "$f1" , o argumento de traço duplo -- significa" nenhuma opção além deste ponto ", portanto, o valor de f1 não será interpretado como uma opção. Mas ainda existe um caso limite: se o valor de f1 é um traço e nada mais, então não é uma opção, é o argumento - , que significa “entrada padrão” (porque o argumento é uma entrada arquivo; para um arquivo de saída, isso significaria “saída padrão”).

O uso do redirecionamento evita todas essas armadilhas.

Isso se aplica à maioria dos comandos, não apenas sort .

    
por 25.07.2018 / 08:04