正则表达式的奇怪“apt-get purge”行为

正则表达式的奇怪“apt-get purge”行为

我正在运行 Debian (jessie) 并关注问题,我按照第一个答案建议安装正在运行的软件包

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

顺便说一句,这并没有解决我的 Eclipse 问题,但后来我注意到一些奇怪的事情:当我运行时

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

它说

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.

没关系,但后来它说

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*

为什么他也选择了

murrine-themes* openshot* xfce4*

难道不应该删除 regEx 的所有匹配情况吗

gtk2-engines-* gtk3-engines*

或者我在这里错过了一些基本的东西?

答案1

$ 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)

如您所见,包 xfce4 依赖于 gtk2-engines-xfce,因此如果删除 gtk2-engines-xfce,apt 也会删除 xfce4。它与您提到的其他软件包类似,因此 openshot 依赖于 gtk2-engines-pixbuf ,而 gtk2-engines-pixbuf 依赖于 gtk2-engines-murrine

我还想指出 Henrik 的评论;
apt-get 可以使用正则表达式作为参数来代替包名称,但是您必须注意在 shell 实际调用命令之前发生的文件匹配。看例子:

$ 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

当你想将正则表达式传递给 apt 时,你应该转义文件通配符,如 *、?、[、] 等,所以正确的命令是:

sudo apt-get remove gtk2-engine\*

答案2

正如已经博班·P 解释说。,如果您请求删除或清除某个包,那么也会删除依赖于它的包。

您可以使用它aptitude why来查看手动安装的软件包依赖于某个软件包的哪些内容,即安装该软件包的原因。参数是单个包名称,而不是 glob 模式或正则表达式。您可以将其与 [能力搜索]((http://aptitude.alioth.debian.org/doc/en/ch02s04s05.html)一次查询多个包。

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

请注意,输出可能会很长。如果没有-v, aptitude 只会列出安装每个软件包的一个原因。

apt-get另外,请注意and命令的参数apt-cache是正则表达式,而不是 shell 通配符模式。如果参数不包含任何特殊字符,则按字面意思使用,但如果参数确实包含特殊字符,()[].?*+则正则表达式只需要匹配包名称的一部分。因此匹配具有子字符串²gtk2-engines-*的包;gtk2-engines这就是为什么gtk2-engines被列为匹配的原因。您可能打算改为编写gtk2-engines-.*,但这也会捕获名称不以gtk2-engines³ 开头的包。要列出以 开头的包gtk2-engines-,请使用^gtk2-engines-

gtk2-engines-*另外,养成在 shell 命令行中引用特殊字符的习惯 — 如果当前目录中存在与 glob 模式匹配的文件(例如.deb您刚刚下载的文件),则该模式将被替换为匹配文件。

1或一个能力倾向搜索模式在某些版本中,但在 Debian jessie 上没有。
²因为gtk2-engines以零次或多次出现-(即零)结尾。
³目前 Debian 中还没有这些。

相关内容