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-\*
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.
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.