O globbing é um recurso do shell?

12

Eu li muitas perguntas e respostas como esta e esta

Eu sei que os curingas são expandidos pelo shell antes de executar um comando e são um recurso do shell. Os curingas também funcionam com os comandos que podem aceitar muitos argumentos. Em find . -name *.rb se tivermos mais de um arquivo no diretório atual findnos dará um erro porque descoberta não pode aceitar vários argumentos e as maneiras de resolver este são:

find . -name "*.rb"
find . -name '*.rb'
find . -name \*.rb

Nós escapamos do asterisco e impedimos a expansão pelo shell, mas os curingas são um recurso do shell; quando escapamos, o shell do asterisco não sabe sobre o seu significado e deve encontrar um arquivo chamado *.rb; então, como o asterisco está sendo expandido nesse caso?

Sinoosh
fonte

Respostas:

21

Sim, o shell entende *como todos os arquivos com qualquer caractere no diretório e *.rbcomo todos os arquivos com qualquer caractere e final .rbe o expande como tal.

O findpróprio comando aceita globbing.

Se você não citar o *, o shell o expandirá antes que o findcomando veja seu argumento. Portanto, em vez de um globo *.rbpassado para find, os nomes de todos os arquivos correspondentes ao globo no diretório serão passados finde findtentarão interpretá-los. como argumentos, o que provavelmente resultará em um erro ou, pelo menos, não o que você deseja (ele funcionará corretamente apenas se não houver arquivos correspondentes no diretório atual)

Zanna
fonte
obrigado, significa que dizemos que o shell não é um glob, mas alguns comandos podem expandir caracteres curinga? ou podemos dizer que, se tivermos um shell sem entender sobre globbing, esses comandos sabem que globbing pode expandi-los?
Sinoosh 22/09/16
5
se o *for citado, o shell não o expandirá, e o argumento incluindo o glob é passado para o comando que pode entender o glob - é o mesmo para todos os comandos que aceitam regex que sempre devem ser citados ...
Zanna
1
Meu prazer ^ _ ^
Zanna 22/09
7
@ Sinoosh: Observe que nem todos os comandos compreendem a sintaxe glob. Ele só passa a ser uma característicafind
slebetman
1
O @Sinoosh Find não está realmente "expandindo" o curinga, está usando-o como um teste para corresponder a cada nome de arquivo encontrado. Existem alguns comandos (muito) que expandem curingas no sentido convencional - descompacte e o 7z pode usá-lo para abrir vários arquivos (quando seus argumentos normalmente têm o formato " [archive filename single argument] [list of files to extract]"), por exemplo.
usar o seguinte código