Comportamento estranho de “apt-get purge” com regEx

1

Estou usando o Debian (jessie) e seguindo esta pergunta, eu segui a primeira sugestão de resposta para instalar os pacotes em execução

sudo apt-get install gtk2-engines-* gtk3-engines*

Isso não resolveu meu problema com o Eclipse btw, mas depois notei algo estranho: quando corri

sudo apt-get purge gtk2-engines-* gtk3-engines*

disse

Reading package lists... Done
Building dependency tree       
Reading state information... Done
Note, selecting 'gtk2-engines-gartoon' for regex 'gtk2-engines-*'
Note, selecting 'gtk2-engines-moblin' for regex 'gtk2-engines-*'
Note, selecting 'gtk2-engines-murrine' for regex 'gtk2-engines-*'
Note, selecting 'gtk2-engines-nodoka' for regex 'gtk2-engines-*'
Note, selecting 'gtk2-engines-qtcurve' for regex 'gtk2-engines-*'
Note, selecting 'gtk2-engines-ubuntulooks' for regex 'gtk2-engines-*'
Note, selecting 'gtk2-engines-pixbuf' for regex 'gtk2-engines-*'
Note, selecting 'gtk2-engines' for regex 'gtk2-engines-*'
Note, selecting 'gtk2-engines-wonderland' for regex 'gtk2-engines-*'
Note, selecting 'gtk2-engines-oxygen' for regex 'gtk2-engines-*'
Note, selecting 'gtk2-engines-cleanice' for regex 'gtk2-engines-*'
Note, selecting 'gtk2-engines-magicchicken' for regex 'gtk2-engines-*'
Note, selecting 'gtk2-engines-xfce' for regex 'gtk2-engines-*'
Note, selecting 'gtk2-engines-aurora' for regex 'gtk2-engines-*'
Note, selecting 'gnome-icon-theme-gartoon' instead of 'gtk2-engines-gartoon'
Note, selecting 'gtk3-engines-oxygen' for regex 'gtk3-engines*'
Note, selecting 'gtk3-engines-xfce' for regex 'gtk3-engines*'
The following packages were automatically installed and are no longer required:
  kde-style-qtcurve kwin-style-qtcurve libgoocanvas-common libgoocanvas3
  libkdecorations4abi2 libmlt++3 libmlt-data libmlt6 libsox-fmt-alsa
  libsox-fmt-base libsox2 melt python-httplib2 python-mlt python-pygoocanvas
  python-xdg
Use 'apt-get autoremove' to remove them.

E isso foi ok, mas depois disse

The following packages will be REMOVED:
  gtk2-engines* gtk2-engines-aurora* gtk2-engines-cleanice*
  gtk2-engines-magicchicken* gtk2-engines-moblin* gtk2-engines-murrine*
  gtk2-engines-nodoka* gtk2-engines-oxygen* gtk2-engines-pixbuf*
  gtk2-engines-qtcurve* gtk2-engines-ubuntulooks* gtk2-engines-wonderland*
  gtk2-engines-xfce* gtk3-engines-oxygen* gtk3-engines-xfce* murrine-themes*
  openshot* xfce4*

Por que ele também selecionou

murrine-themes* openshot* xfce4*

?

Não basta remover todos os casos correspondentes de regEx

gtk2-engines-* gtk3-engines*

ou estou faltando algo básico aqui?

    
por igng 20.03.2016 / 12:58

2 respostas

2
$ apt-cache show xfce4 | grep ^Depends
Depends: xfwm4 (>= 4.12.0), xfconf (>= 4.12.0), xfce4-settings (>= 4.12.0), xfce4-panel (>= 4.12.0), xfdesktop4 (>= 4.12.0), thunar (>= 1.6.6), gtk2-engines-xfce (>= 3.2.0), xfce4-session (>= 4.12.0), xfce4-appfinder (>= 4.12.0), xfce4-mixer (>= 4.10.0), orage (>= 4.10.0), libxfce4ui-utils (>= 4.12)

Como você pode ver, o pacote xfce4 depende do gtk2-engines-xfce, então se você remover o gtk2-engines-xfce, o apt também removerá o xfce4. É semelhante a outros pacotes que você mencionou, então o openshot depende do gtk2-engines-pixbuf e do gtk2-engines-pixbuf depende do gtk2-engines-murrine

Eu também gostaria de apontar o comentário de Henrik;
O apt-get pode ter o regex como argumento no lugar dos nomes dos pacotes, mas você precisa cuidar da globalização de arquivos que ocorre antes que o shell realmente chame o comando. Veja o exemplo:

$ touch gtk2-engine-test
$ sudo apt-get remove gtk2-engine*
[sudo] password for boban: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package gtk2-engine-test

Quando você quer passar o regex para o apt, você deve escapar de caracteres globbing de arquivo como *,?, [] e assim por diante, então o comando correto seria:

sudo apt-get remove gtk2-engine\*
    
por 20.03.2016 / 13:09
2

Como já explicado por Boban P. , se você solicitar remover ou limpar um pacote, isso também removerá os pacotes que dependem dele.

Você pode usar aptitude why para ver quais pacotes instalados manualmente dependem de um pacote, ou seja, por que o pacote está instalado. O argumento é um nome de pacote único¹, não um padrão glob ou um regexp. Você pode combiná-lo com uma [pesquisa de aptitude] (( link ) para consultar vários pacotes de uma só vez .

aptitude -v why $(aptitude -F %p search '~i ~ngtk2-engines.*')

Tenha em atenção que a saída pode ser muito longa. Sem -v , o aptitude lista apenas uma única razão pela qual cada pacote é instalado.

Além disso, observe que o argumento dos comandos apt-get e apt-cache é uma expressão regular, não um padrão curinga de shell. Se o argumento não contiver nenhum caractere especial, ele será usado literalmente, mas se o argumento contiver caracteres especiais ()[].?*+ , então o regexp precisará corresponder apenas a uma parte do nome do pacote. Portanto, gtk2-engines-* corresponde aos pacotes que têm gtk2-engines como substring²; é por isso que gtk2-engines foi listado como correspondido. Você provavelmente quis escrever gtk2-engines-.* , mas isso também teria pegado pacotes cujo nome não inicia com gtk2-engines ³. Para listar os pacotes que começam com gtk2-engines- , use ^gtk2-engines- .

Além disso, adquira o hábito de citar caracteres especiais em uma linha de comando do shell - se houvesse um arquivo correspondente ao padrão de glob gtk2-engines-* no diretório atual (por exemplo, um arquivo .deb que você acabou de baixar) então o padrão teria sido substituído pelo (s) arquivo (s) correspondente (s).

¹ Ou um padrão de pesquisa do aptitude em algumas versões, mas não no Debian Jessie.
² Porque gtk2-engines termina com zero ou mais ocorrências de - (ou seja, zero).
³ Dos quais não há nenhum no Debian no momento.

    
por 20.03.2016 / 16:00