Diferença entre {1,2,3} e {1..3}

17

Existe uma diferença entre as sequências {1,2,3} e {1..3} ?

Por exemplo, se eu tiver alguns arquivos

file.1
file.2
file.3

e eu quero cat deles juntos é seguro usar cat file.{1..3} > file

O que eu sei é que cat file.*>file poderia causar problemas porque o shell pode expandir os arquivos de forma aleatória algumas vezes (acho que isso depende dos inodes, não é?)

    
por syss 17.11.2015 / 15:28

3 respostas

17

{1..3} e {1,2,3} produzem o mesmo resultado, mas de maneira diferente.

Em geral, {n1..n2} (que veio primeiro de zsh , bash e ksh copiou depois) onde n1 e n2 são inteiros produzem todos os números entre n1 e n2 . Enquanto {x,y,z} produz três caracteres x , y e z .

No seu caso, você pode usar com segurança cat file.{1..3} > file

Agora, no caso de cat file.*>file , você usou a conchagem , que produzem todos os nomes de arquivos iniciados com file. e o resultado será classificado com base na ordem de agrupamento na localidade atual.

Você ainda está seguro, mas não mais quando tiver mais de 10 arquivos. {1..10} dará 1 2 3 4 5 6 7 8 9 10 . Enquanto estiver com globbing, você receberá 1 10 2 3 4 5 6 7 8 9

    
por 17.11.2015 / 15:49
8

A diferença é que um é uma lista e o outro é uma sequência. {1,2,3} expande para três elementos específicos, 1 , 2 e 3 . {1..3} se expande para a lista de números entre um e três. Neste caso particular, eles são os mesmos e você pode usar qualquer um dos dois. file.* será expandido para todos os arquivos e diretórios no diretório atual cujo nome começa com file. . Se você tiver apenas file.1 , file.2 e file.3 , isso também é equivalente aos outros dois.

Quanto a causar problemas, não vejo por quê. Você pode estar pensando em

$ cat file.* > file.txt
cat: file.txt: input file is output file

Isso, no entanto, é um assunto completamente diferente. O único outro problema que posso pensar é que o seu shell pode não listar os arquivos na ordem correta. Por exemplo:

$ touch file1 file11 file2
$ echo file*
file1 file11 file2

Para resolver isso, você pode usar zsh em vez de bash (consulte aqui para detalhes):

% echo f*(n)
file1 file2 file11

Em geral, as três abordagens não são as mesmas. Depende do que você quer fazer. Nos casos em que os três retornam a mesma saída, sim, você pode usar qualquer um deles. Não faz diferença. Todas essas expansões são feitas pelo shell e acontecem antes que são passadas para qualquer comando que as use.

    
por 17.11.2015 / 15:36
6

Eles são os mesmos, mas depende da versão bash que você instalou, se estiverem disponíveis.

De esta página:

{xxx,yyy,zzz,...} probably in all bash versions

{a..z} introduced in bash 3

{<START>..<END>..<INCR>} new in bash 4
    
por 17.11.2015 / 15:38

Tags