为什么apt-get安装Virtual Box而不是g ++?

我刚刚遇到一些我不知道可能是Linux终端的主要安全问题的东西。 我试图安装g ++ 5.0。 我是Linux的新手,所以我只输入了sudo apt-get install g++ 5.0 。 它不是只返回错误或其他东西, 而是安装了Virtual Box!

如果我尝试从终端安装一件东西并安装完全不同的东西,这是否意味着它可能发生在其他东西上,可能是恶意软件? 无论如何,当我输入完全不同的东西时,为什么要安装Virtual Box?

命令

 sudo apt-get install g++ 5.0 

表示您要安装两个软件包: g++5.0 。 (包名称没有空格,apt-get接受多个包名称,用空格分隔。)

可能发生的是它按要求安装了g ++,然后安装了与正则表达式5.0匹配的所有包(包括版本号)(因为没有包实际上命名为5.0 )。 (谢谢@edwinksl!)

为避免这种情况,请确保您拥有正确的软件包名称,不含空格。 您还可以使用-s选项模拟apt-get操作,然后再进行实际操作:

 sudo apt-get -s install g++ 5.0 

将显示命令执行的操作,而不实际安装任何内容。 如果看起来没问题,可以删除-s以执行安装。

您还可以考虑使用更新手友好的图形包管理器,例如synapticmuon

安装g++版本5.x的正确命令是:

 sudo apt-get install g++-5 

这将在xenial上安装g++版本5.3,这是当前的默认设置(所以apt-get install g++安装它,但将来会改变)。 事实上,GCC 没有公开5.0版本 。 其他g++版本是打包的,例如g++-4.9g++-6 ,它们可以以相同的方式安装。

如果您需要安装未为您的系统打包的特定(现有) g++ ,则必须从源代码构建它 。

让我们分解吧。

首先,关于apt-get install (以及大多数其他apt-get参数)如何工作的几点注释:

  • 您可以输入多个包名称:

     sudo apt-get install foobar spamegg 
  • 包名称实际上是扩展正则表达式(ERE)(检查man 7 regex )模式,因此包名称foo.bar表示任何包含名称以foo开头并以foobar之间的任何单个字符结束的子字符串的包名称。 可能f.*r表示包含子字符串的任何包名称,该子字符串具有fr以及任意数量的字符,即介于两者之间的任何字符。 要完成整个包名称匹配,请使用开始和结束标记,例如^foo.bar$ 。 如果你想要字面上处理任何正则表达式令牌,那么你需要使用\来转义令牌,例如,对于foo.bar字面意思,你需要:

     sudo apt-get install 'foo\.bar' 

    这里的单引号是为了防止将模式的shell解释为通配模式,在这种情况下不是必需的,但是例如对于模式foo.*bar需要foo.*bar如果你在当前目录中有一个名为例如foo.bar

  • 包名称考虑因素有一个问题。 如果有任何与模式匹配的包,则将按字面处理该模式,并且不会执行正则表达式解释。 例如,对于包模式g++ ,它将与字符串g++完全匹配,而不管Regex标记+ 。 如果在定义的存储库中没有名为g++包,则将其视为ERE模式。

现在,您已经给出了命令:

 sudo apt-get install g++ 5.0 

这意味着:

  • 你想安装两个模式提供的包,即g++5.0

  • g++与上面提到的文字元包g++相匹配

  • 剩下的部分5.0有一个Regex令牌. 即任何单个字符。 因此,这将匹配包含50任何包名称。 因此,已选择安装所有具有匹配的软件包,并且在此过程中也可能选择了virtualbox-5.0

大概你想要安装g++版本5 ,所以做以下操作( 在这个回答中已经提到 ); 元数据包g++-5将引用g++版本5的最新可用次要发布包:

 sudo apt-get install g++-5 

要在配置的存储库中搜索任何包,请使用apt-cache (使用类似apt-get ERE):

 apt-cache search 'g\+\+-[0-9]+' 

如果您不想使用Regex-ify,请使用less来向下滚动相当大的列表:

 apt-cache search g++ | less 

在安装任何你不确定的东西之前,不要使用-y (– --assume-yes )选项并首先使用-s (– --simulate / --dry-run )测试它:

 sudo apt-get install --dry-run foobar