Como o bash * é passado para um programa?

1

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

    
por user403723 26.01.2015 / 03:22

1 resposta

1

Bash realiza a expansão do shell em cada linha de comando. Uma dessas expansões é expansão de nome de arquivo que substitui * de acordo com as regras padrões de correspondência .

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

Portanto, o binário evince é executado pelo Bash apenas uma vez, com argumentos que são alfabeticamente contidos no diretório de trabalho atual. A maneira como o Evince lida com o lançamento depois disso é com o Evince ou qualquer outro framework ou biblioteca do qual ele dependa, mas os barebones X não fazem 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 o * é expandido, basta executar echo * . Você pode perceber que, se o diretório de trabalho estiver vazio (contém apenas arquivos de pontos), o asterisco não será expandido e permanecerá como argumento para a execução de comandos.

Como mencionado no manual de Bashs vinculado, há várias configurações que alteram esse comportamento. Sem mencionar outras conchas.

    
por 26.01.2015 / 04:22

Tags