在“程序'x'当前未安装”之后询问是否安装该程序。

如果你尝试执行一个未安装的程序,你将会收到一条消息。
The program 'x' is currently not installed. You can install it by typing: 
sudo apt-get install x

而不是为您安装程序,它要求您输入实际的命令。如何更改这种行为?
4个回答

负责此行为的软件包是 command-not-found Install command-not-found 软件包,它已经包含了所需的行为,尽管默认情况下被禁用。您可以通过将以下行添加到您的 ~/.bashrc 文件来启用它。

export COMMAND_NOT_FOUND_INSTALL_PROMPT=1

现在行为已经改变为
The program 'x' is currently not installed. You can install it by typing:
sudo apt-get install x
Do you want to install it? (N/y)

注意: 如果您收到有关Python崩溃的消息(具体来说是`AttributeError: 'str' object has no attribute 'decode'`),这是bug 1073919。对于Raring和Saucy,已经提供了修复方法。或者(仅限高级用户),您可以更改文件`/usr/lib/python3/dist-packages/CommandNotFound/CommandNotFound.py`,请参阅附加到错误报告的差异以了解需要更改的行。
编辑:修复程序现在已在Raring(SRU)版本0.3ubuntu7.1和Saucy版本0.3ubuntu8中发布。

我的解决方案是安全性和舒适性的混合:

auto-apt检查其环境中运行的程序的文件访问情况,如果程序尝试访问一个已知属于未安装软件包的文件,auto-apt将使用apt-get安装该软件包。此功能需要apt和sudo来工作。它还提供了一个简单的数据库,用于搜索包含所请求文件的软件包。

这是一个终端仿真器,在其中每个文件访问都经过auto-apt预先验证,如果不存在,则在数据库中搜索(类似于apt-file),并下载和安装所需的软件包,然后允许程序继续执行。您应以root权限运行它:

sudo auto-apt

这在构建软件包时非常有用,如果你不想一直盯着屏幕寻找每个配置错误、缺少头文件等。
这也可以作为apt-get + apt-file的替代品,你只需告诉命令要执行什么程序即可安装。
但你必须明白,在系统没有被监视时,不要让它一直开着,因为这几乎相当于使用root用户。
手册页面:http://derpi.tuwien.ac.at/cgi-bin/man/man2html?1+auto-apt

自动安装是个不好的主意。如果你想省些打字,可以使用
sudo apt-get install !!

其中的 !! 将被替换为历史记录中的最后一条命令。你可能也可以将其作为别名使用,但我不知道如何添加 !! 而不对其进行评估。

然而,正如 @eliah-kagan 和 @gertvdijk 在评论中提到的那样,还有一些注意事项。某些程序的软件包名称与您执行的二进制文件不同。此外,当向二进制文件传递参数时,可能会导致一些意外结果。


当然,我知道我的建议并不是一个很好的解决方案,但根据用户的需求,它可能足够好用。 - l3dx
5命令名称(系统上二进制文件的文件名)不一定与软件包的名称相同。 - gertvdijk
3尽管我仍然有一些疑虑(包括@gertvdijk提到的软件包和命令名称通常不同,以及对传递给原始命令的额外命令行参数可能产生非常严重影响的担忧),但似乎你找对了方法。经过一些测试,实际上这比理论上的效果要好(我认为)。我仍然建议扩展这个答案以进行澄清、警告,并可能详细介绍其他选项。无论如何,我曾经给这个回答投过反对票,但现在已经取消了反对票。 - Eliah Kagan

有几种快速安装建议软件包的方法:
  • 在某个地方(例如~/.bashrc)添加export COMMAND_NOT_FOUND_INSTALL_PROMPT=1

    这是最“酷”的方法,虽然显然不太安全,但大概90%的时间会引起内部的“谢谢,这正是我想让你做的!”的反应。

    (这种方法的一个个人缺点是我似乎发现很难记住/搜索答案,所以到目前为止我很少使用它。)

  • 如果您使用的是默认终端,您可以快速选择该行并中键单击将其直接粘贴到命令行中。(其他终端或SSH应用程序可能有不同的方法。)

    实际上,我倾向于发现这样做足够快速,并且稍微更难“意外”进行,并且不需要任何先前的设置,所以我倾向于这样做。

  • 然而,还有一些值得注意的地方-如果您可以(或者想要学会)快速输入-可以直接键入sudo apt install packagename

    它有助于锻炼肌肉记忆,并且意味着您必须阅读和输入软件包名称,这意味着您将更容易记住它。在最近的Ubuntu版本中,这也稍微容易一些,因为apt可以替代apt-get


1你可能是想说~/.bashrc而不是~/.bash_rc - edwinksl
谢谢,我可能是在想.bash_profile - mwfearnley