Como o * do bash é passado para um programa?

Como o * do bash é passado para um programa?

Quando digito evince *em uma pasta com muitos pdfs, o que é enviado para evidenciar? O evince recebe X argumentos ou são abertas X ocasiões de evince, cada uma recebendo um argumento (um único arquivo)?

Responder1

Bash executa a expansão do shell em cada linha de comando. Uma dessas expansões éexpansão do nome do arquivoque substitui *de acordo comcorrespondência de padrõesregras.

No caso de evince *, ele substitui *pelo conteúdo do diretório de trabalho atual. O conteúdo significa nomes de arquivos regulares, subdiretórios, links, etc. Arquivos de ponto são excluídos. Basicamente, o que você ganha ao correr ls. No seu caso, nomes de arquivos de PDFs.

Portanto, o evincebinário é executado pelo Bash apenas uma vez com argumentos sendo nomes de arquivos ordenados alfabeticamente contidos no diretório de trabalho atual. A maneira como o Evince lida com seu lançamento posteriormente depende do Evince ou de qualquer estrutura ou biblioteca da qual ele depende, mas o barebones X não faz nada de especial aqui. Evince ou X nem sabem que foi executado com *. Por exemplo:

$ ls -a
. .. .hiddendoc.pdf doc1.pdf doc2.docx otherdoc.pdf somedir
$ evince *
# is equivalent to
$ evince doc1.pdf doc2.docx otherdoc.pdf somedir

Se você quiser saber como *é expandido, basta executar echo *. Você pode notar que se o diretório de trabalho estiver vazio (contém apenas arquivos de ponto), o asterisco não é expandido e permanece como argumento para execução do comando.

Conforme mencionado no manual do Bash vinculado, há várias configurações que alteram esse comportamento. Sem mencionar outras conchas.

informação relacionada