Lembre-se de usar
--
ao passar argumentos arbitrários para comandos (ou use redirecionamentos sempre que possível). Então,sort -- "$f1"
ou melhor, emsort < "$f1"
vez desort "$f1"
.
Por que é preferível usar --
e redirecionar?
Por que é sort < "$f1"
preferível sort -- "$f1"
?
Por que é sort -- "$f1"
preferível sort "$f1"
?
Obrigado.
Respostas:
falha nos valores
$f1
que começam com-
ou aqui, no caso desort
alguns que começam com+
(podem ter graves consequências para um arquivo chamado,-o/etc/passwd
por exemplo).(em que
--
sinaliza o final das opções) soluciona a maioria desses problemas, mas ainda falha no 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 executado.Para limpar alguma confusão possível (seguindo os comentários abaixo), isso não impede que o comando entre
mmap()
no arquivo oulseek()
dentro dele (não é o quesort
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 localcat file | cmd
ondecmd
o stdin desta vez é um tubo que não pode ser mapeado / procurado.fonte
sort
a ler os dados sequencialmente e você não podemmap
o arquivo. Emborasort
possa não ter muitos problemas, considere o desempenho deless <file
eless file
. No primeiro caso,less
é necessário manter todo o conteúdo do arquivo na memória; no segundo, é permitido ler apenas as partes que ele deseja. Agora imagine quefile
seja um arquivo de log de 100 GB ...less <file
mantenha todo o arquivo na memória, mas não é obrigado a isso, é uma falha de menos. Somentecat file | less
é forçado a. Confiraless /dev/fd/0 <f
, que não mantém o arquivo na memória, mesmo que o receba no stdin. É um equívoco comum que stdin no Unix é inseparável. De fato, ele pode ser procurado, dependendo do tipo de arquivo.read()
lê dados em seqüência de um arquivo, enquantommap()
lê todo o arquivo na memória de uma só vez?sort
POSIX. Mas é verdade que nem sempre é suportado.getopt()
função C reconhece esse significado do argumento--
. Mas o ponto principal é o que você aceita: a manipulação de argumentos é o domínio de programas individuais, e nem todos tratam--
especialmente.O problema é os nomes de arquivos que começam com um traço.
sort "$f1"
não funcionará 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 double dash--
significa "sem opções além deste ponto", portanto o valor def1
não será interpretado como uma opção. Mas ainda existe um caso extremo: se o valor def1
for um traço e nada mais, não será 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
.fonte
sort < "$f1"
isso funcionaria se o valor fosse igual a-
? Não existe em nenhum shell que eu tentei.seq 10 > -; sort -
comseq 10 > -; sort < -
.