Esta questão é uma continuação dehttps://stackoverflow.com/questions/7136899/how-does-grep-work
Parece que ele shell
faz a expansão *.*
para todos os arquivos aplicáveis/disponíveis e fornece isso para utilitários como grep
.
Por que a shell
necessidade de fazer isso? Por que não deixar a expansão do nome do caminho para o próprio utilitário?
Responder1
Bem, um dos motivos é que todo utilitário teria que implementar essa funcionalidade. Se o shell fizer isso, ele será implementado apenas uma vez.
Responder2
Porque se o shell não fornecesse esse recurso, cada pequeno utilitário teria que implementá-lo.
Isso também garante que a expansão funcione exatamente da mesma maneira para todos os comandos.
Aliás, a expansão não ocorre apenas em argumentos de comando, pode ocorrer em qualquer lugar em um script de shell; por exemplo:
for file in *.c; do something; done
Responder3
Se o shell não fornecesse essa funcionalidade, cada utilitário precisaria implementar sua própria funcionalidade curinga (e provavelmente a maioria não se incomodaria em fazer isso). Do jeito que está, cada utilitário só precisa processar nomes de arquivos individuais, o que é muito mais simples.
Responder4
É a filosofia Unix de "Faça com que uma ferramenta faça bem uma coisa". Por que alguém iria querer essa repetição de código em todos os utilitários? Qual é o sentido de ter todo e qualquer utilitário após main() chamar expand_pathnames()? Qual é o sentido de colocar esse fardo não apenas nos programas C, mas também em todas as linguagens compiladas e linguagens de script? Não há sentido em tudo isso. É por isso que a Microsoft e a abominação cmd.exe erraram desde o primeiro dia :-)
A propósito, se você quiser desativar o globbing do nome do arquivo, você pode fazer isso com
$ set -f
$ echo *
*
$ set +f
$ echo *
readme foo.o bar.txt