Bash globs como argumentos não-arquivo. Exemplo: apt-get remove pkg- *

3

Eu sei que * e outros padrões globais são transformados em palavras pela expansão do nome do caminho, com base no diretório de trabalho atual. No entanto, alguns comandos parecem usá-los para argumentos não-arquivos. Por exemplo, eu uso dpkg -l pkg-* para listar os pacotes com pkg- . Eu pensei que os programas não pudessem ver seus argumentos antes da expansão, somente depois. Não é este o caso? Como isso funciona?

Eu li recentemente sobre algumas estranhezas que o autor chamou de apelidos mágicos , que eu acho poderia ser usado para fazer isso.

    
por spelufo 24.12.2014 / 01:03

2 respostas

3

O problema é que, se pkg-* não corresponder a nenhum arquivo no diretório atual, ele será passado para o dpkg como está. É realmente uma má ideia. Deve-se citar o tempo todo. Por exemplo: dpkg -l pkg-\*

    
por 24.12.2014 / 01:33
0

Você está certo: os programas só podem ver seus argumentos depois de terem sido expandidos pelo shell, eles não podem ver os curingas originais. No entanto, o shell Bourne e seus sucessores (ksh, bash, dash,…) deixam curingas não expandidos se corresponderem a 0 arquivos. Portanto, enquanto não houver nenhum arquivo cujo nome comece com pkg- no diretório atual, dpkg -l pkg* transmitirá os dois argumentos -l e pkg-* a dpkg .

Isso é feito como uma conveniência para evitar ter que citar caracteres curinga em palavras que não deveriam ser interpretadas como nomes de arquivos e não correspondem a nenhum nome de arquivo. Mas alguns shells se comportam de maneira diferente e podem abortar o comando se os wildcards não corresponderem a nada (comportamento padrão em csh, tcsh, zsh e fish - exceto que quando há vários padrões consecutivos, é OK para alguns deles não corresponderem a nada pelo menos um corresponde a um arquivo) ou expande curingas correspondendo a nada a nada ( N mod do glob ou null_glob shell opção no zsh, N padrão opção no ksh, nullglob shell opção no bash). Esse último comportamento tem a vantagem da regularidade (um padrão não correspondente se expande para a lista de correspondências, igual a uma que corresponde a um ou mais arquivos), o que o torna preferível em scripts.

Para garantir que um padrão não seja expandido acidentalmente, cite seus caracteres curinga: dpkg -l 'pkg-*' ou dpkg -l pkg-\* .

Nenhuma das shells usuais está ciente de quais argumentos de quais comandos são arquivos (onde globbing é desejável) e quais são outras coisas que devem idealmente ser deixadas em paz. O Zsh pode ser desativado para desativar um comando específico escrevendo noglob , por exemplo, %código%. noglob dpkg -l pkg-* é frequentemente usado em um alias como noglob . Os bash “magic aliases” descritos por Simon Tatham simulam o alias lynx='noglob lynx' do zsh.

    
por 25.12.2014 / 03:00