为什么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
以执行安装。
您还可以考虑使用更新手友好的图形包管理器,例如synaptic
或muon
。
安装g++
版本5.x的正确命令是:
sudo apt-get install g++-5
这将在xenial上安装g++
版本5.3,这是当前的默认设置(所以apt-get install g++
安装它,但将来会改变)。 事实上,GCC 没有公开5.0版本 。 其他g++
版本是打包的,例如g++-4.9
或g++-6
,它们可以以相同的方式安装。
如果您需要安装未为您的系统打包的特定(现有) g++
,则必须从源代码构建它 。
让我们分解吧。
首先,关于apt-get install
(以及大多数其他apt-get
参数)如何工作的几点注释:
-
您可以输入多个包名称:
sudo apt-get install foobar spamegg
-
包名称实际上是扩展正则表达式(ERE)(检查
man 7 regex
)模式,因此包名称foo.bar
表示任何包含名称以foo
开头并以foo
和bar
之间的任何单个字符结束的子字符串的包名称。 可能f.*r
表示包含子字符串的任何包名称,该子字符串具有f
和r
以及任意数量的字符,即介于两者之间的任何字符。 要完成整个包名称匹配,请使用开始和结束标记,例如^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令牌.
即任何单个字符。 因此,这将匹配包含5
任何包名称。 因此,已选择安装所有具有匹配的软件包,并且在此过程中也可能选择了0 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