De https://unix.stackexchange.com/a/458074/674
Lembre-se de usar
--
ao passar argumentos arbitrários para comandos (ou use redirecionamentos sempre que possível). Assimsort -- "$f1"
ou melhorsort < "$f1"
em vez desort "$f1"
.
Por que é preferível usar --
e redirecionar?
Por que é sort < "$f1"
preferido sort -- "$f1"
?
Por que é sort -- "$f1"
preferido sort "$f1"
?
Obrigado.
falha para valores
$f1
que começam com-
ou aqui para o caso desort
alguns que começam com+
(pode ter consequências graves para um arquivo chamado-o/etc/passwd
por exemplo).(onde
--
sinaliza o fim das opções) aborda a maioria desses problemas, mas ainda falha para o arquivo chamado-
(quesort
interpreta como significando seu stdin).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
(ao contrário de
sort -- "$f1" > out
), se"$f1"
não puder ser aberto,out
não será criado/truncado esort
nem mesmo executado.Para esclarecer algumas possíveis confusões (seguindo os comentários abaixo), isso não impede que o comando entre
mmap()
no arquivo oulseek()
dentro dele (sort
também não) desde que o próprio arquivo seja pesquisável. A única diferença é que o arquivo é aberto mais cedo e no descritor de arquivo 0 pelo shell, em oposição a 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 comcat file | cmd
ondecmd
o stdin desta vez é um tubo que não pode ser mapeado/procurado.O problema são nomes de arquivos que começam com um traço.
sort "$f1"
não funciona se o valor def1
começar com-
porque o comando interpretará o valor como uma opção. Isso geralmente resulta em um erro, mas pode até causar uma falha de segurança . Comsort -- "$f1"
, o argumento de traço duplo--
significa “nenhuma opção além deste ponto” então o valor def1
não será interpretado como uma opção. Mas ainda há um caso extremo: se o valor def1
é um traço e nada mais, então não é uma opção, é o argumento-
, que significa “entrada padrão” (porque o argumento é um arquivo de entrada; para um arquivo de saída significaria “saída padrão”).Usar o redirecionamento evita todas essas armadilhas.
Isso se aplica à maioria dos comandos, não apenas
sort
.