Discrepância entre as duas expansões

2

Se você inserir o comando ls * e echo * , você notará a notável discrepância entre os resultados. O primeiro inclui recursivamente, enquanto o segundo exclui totalmente os arquivos em subdiretórios. Eles não se comportam da mesma maneira para a expansão do nome do caminho?

    
por user43312 08.09.2013 / 16:45

2 respostas

9
Por padrão,

ls lista o conteúdo dos diretórios se passado como argumentos. Quando você passa * para seu shell, seu shell expande * para todos os arquivos e diretórios (no diretório de trabalho atual) e então ls pega esses argumentos e os processa. Como resultado, ele lista o conteúdo desses diretórios especificados junto com os arquivos no diretório de trabalho atual.

No caso de echo , o shell expandiu o * e você não obtém o conteúdo do diretório, porque o echo apenas imprime o que foi passado para ele como argumentos.

Você pode dizer a ls para não mostrar o conteúdo dos diretórios usando ls -d * .

Dada esta configuração:

$ mkdir dir{1,2}
$ touch file{1..3} dir{1,2}/morefiles{1..5}
$ ls
dir1  dir2  file1  file2  file3

Passar * para o shell (bash) faz com que o bash expanda * para dir1 dir2 file1 file2 file3 . Usar echo com * fará com que echo exiba o que o shell expandiu de * :

$ echo *
dir1 dir2 file1 file2 file3

No entanto, os argumentos dos diretórios ls irão, por padrão, expandir o conteúdo dos diretórios listados:

$ ls *
file1  file2  file3

dir1:
morefiles1  morefiles2  morefiles3  morefiles4  morefiles5

dir2:
morefiles1  morefiles2  morefiles3  morefiles4  morefiles5
$ 

Você pode descartar o * on ls (conforme ilustrado depois de criar a estrutura de diretórios de exemplo) ou, conforme mencionado em minha resposta, usar ls -d * :

$ ls -d *
dir1  dir2  file1  file2  file3

Isso impede que ls mostre o conteúdo de dir1/ e dir2/ .

    
por 08.09.2013 / 16:52
5

Só para esclarecer a excelente resposta de DravSloan, não há discrepância. * é expandido em ambos os casos pelo shell e, em ambos os casos, expande exatamente a mesma coisa. A diferença está no modo como echo e ls tratam seus argumentos.

echo apenas imprimirá cada um dos argumentos que você fornecer. ls list directory contents como diz o manual. Assim, em ambos os casos, o shell executa o programa à esquerda ( echo ou ls ) e o programa em questão faz o que quer que seja feito com cada um de seus argumentos. O resultado é diferente porque os programas são diferentes, não porque * seja expandido de forma diferente.

    
por 08.09.2013 / 17:34