Por que o shell executa a expansão do nome do caminho para utilitários?

Por que o shell executa a expansão do nome do caminho para utilitários?

Esta questão é uma continuação dehttps://stackoverflow.com/questions/7136899/how-does-grep-work

Parece que ele shellfaz a expansão *.*para todos os arquivos aplicáveis/disponíveis e fornece isso para utilitários como grep.

Por que a shellnecessidade 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

informação relacionada