如何让 apt-get install 的噪音更小?

jbt*_*ule 159 apt

如果我使用apt-get install -qq mono-devel,我希望它是安静的,除了错误,根据帮助:

-qq No output except for errors
Run Code Online (Sandbox Code Playgroud)

相反,我得到:

Extracting templates from packages: 100%
Selecting previously unselected package binfmt-support.
(Reading database ... 84711 files and directories currently installed.)
Unpacking binfmt-support (from .../binfmt-support_2.0.8_i386.deb) ...
Selecting previously unselected package cli-common.
Unpacking cli-common (from .../cli-common_0.8.2_all.deb) ...
Selecting previously unselected package libgdiplus.
Unpacking libgdiplus (from .../libgdiplus_2.10-3_i386.deb) ...
Selecting previously unselected package libmono-2.0-1.
Unpacking libmono-2.0-1 (from .../libmono-2.0-1_2.10.8.1-1ubuntu2.2_i386.deb) ...
Selecting previously unselected package libmono-2.0-dev.
Unpacking libmono-2.0-dev (from .../libmono-2.0-dev_2.10.8.1-1ubuntu2.2_i386.deb) ...
Selecting previously unselected package libmono-corlib4.0-cil.
Unpacking libmono-corlib4.0-cil (from .../libmono-corlib4.0-cil_2.10.8.1-1ubuntu2.2_all.deb) ...
Selecting previously unselected package libmono-system-xml4.0-cil.
Unpacking libmono-system-xml4.0-cil (from .../libmono-system-xml4.
Run Code Online (Sandbox Code Playgroud)

还有更多...

事实上,有几百行的输出。这似乎与no output except for errors.

当出现阻止安装的错误时,我如何才能真正apt-get install打印出来?

Mik*_*ike 102

apt-get 的手册页如下:

NAME
       apt-get - APT package handling utility -- command-line interface

SYNOPSIS
       apt-get [-asqdyfmubV] [-o=config_string] [-c=config_file] [-t=target_release]
               [-a=architecture] {update | upgrade | dselect-upgrade | dist-upgrade |
               install pkg [{=pkg_version_number | /target_release}]...  | remove pkg...  |
               purge pkg...  | source pkg [{=pkg_version_number | /target_release}]...  |
               build-dep pkg [{=pkg_version_number | /target_release}]...  |
               download pkg [{=pkg_version_number | /target_release}]...  | check | clean |
               autoclean | autoremove | {-v | --version} | {-h | --help}}
Run Code Online (Sandbox Code Playgroud)

-q-qq标志应该去之前的命令,就像这样:

apt-get -qq upgrade

  • 不,它不起作用。即使在安装命令之前使用`-qq`,我仍然会收到大量垃圾,从读取数据库到解包和设置消息。 (51认同)
  • 同样在这里:我尝试将“-qq”放在“install”之前以及“install”之后,这两种情况仍然导致“正在解压...”、“选择...”、“正在准备...”等等我不想看到的消息。我正在使用 `ubuntu:20.04` Docker 容器 (4认同)
  • 这是正确答案!任何实际的实现都需要保留提示。正确使用,`-q` 绝对有效(没有“动画”输出)以及 `-qq`(除了错误之外没有输出)。请点赞! (3认同)
  • 这是 Ubuntu 16.04.1,作为 Docker 容器运行。我的猜测是这些消息实际上来自 dpkg,它被 apt-get 调用。命令是`apt-get -qq update && apt-get -qq upgrade && apt-get -qq install build-essential`。见 https://gist.github.com/stefanlasiewski/be6776296e07e709e9d978d36c3681c5 (3认同)
  • 在 Docker 中,您有两种选择:(1) 单独运行每个命令,而不是使用 `&&` 加入它们(可能有效,但它不是“docker 方式”)(2)将输出重定向到 /dev/null 就像另一个回答。当存在此错误时,选项 2 可能是您最好的选择。 (3认同)
  • 这个答案是错误的。无论在何处或使用哪个命令,“-qq”都无法实现OP想要的效果。 (3认同)
  • 好吧,我已经尝试过 `sudo apt-get -qq -y install mercurial`、`sudo apt-get install -qq -y mercurial`、`sudo apt-get -qq install -qq -y mercurial` 和其他涉及的变体甚至更多的问题(尽管我没有看到任何表明这会起作用的文档。顺便说一句,我正在谷歌云上运行 Debian Jessie (8)。我也尝试过 Goetz 的答案,但它似乎也不起作用。通过似乎不起作用,我的意思是我没有注意到有什么不同。 (2认同)
  • @Mike:我注意到,您没有运行与OP相同的命令 - 它是“安装”而不是“更新”或“升级”。这些会被静音,但就像在其他帖子中一样,安装在下面使用“dpkg”,它会生成输出。这个答案没有回答原来的问题。 (2认同)

小智 76

我们遇到了同样的问题。apt-get install -qq删除了大部分输出,但烦人的“(读取数据库...”仍然存在。

我们查看了 apt 的源代码,发现输出是由 apt 分叉的 dpkg 产生的。然后dpkg的源码显示,恼人的soutput只有在isatty(1)为true时才会发出。只有当 fork 使用 pty 代替管道时才会出现这种情况。回到apt,有一个未记录的配置变量允许使用管道代替pty,然后解决问题:

apt-get install -qq -o=Dpkg::Use-Pty=0 <packages>
Run Code Online (Sandbox Code Playgroud)

期待这可以帮助他人。

  • 此答案不适用于 Ubuntu 18.04。 (5认同)
  • 其实这是完全正确的答案。它还允许使用单个 -q 运行 apt-get 并查看 *some* 输出并且看不到烦人的“阅读数据库” (4认同)
  • `-o=Dpkg::Use-Pty=0` 在 Ubuntu 18.04 上运行完美。它只显示一个“阅读数据库”,而不是多个,每 5% 更新一次进度。 (3认同)
  • 我正在 gcloud debian jessie (8) 上尝试这个,但我仍然在阅读数据库行和解包/设置行。 (2认同)
  • 还有一堆选择/准备/设置线...... (2认同)
  • 似乎 `-o=Dpkg::Use-Pty=0` 不会影响 Ubuntu 20.04 中的输出。 (2认同)
  • 添加 `-o=Dpkg::Use-Pty=0` 似乎已经成功抑制了 `apt-get update` 和 `apt-get update` 中的消息,但我仍然收到 `Unpacking ...`, “选择...”、“准备...”等消息。我正在使用 `ubuntu:20.04` Docker 容器 (2认同)

Oli*_*Oli 60

一个简单的重定向就可以做到这一点。我敢肯定,这并不完全是您的想法,但它确实有效:)

简而言之,只需> /dev/null在您想要将所有内容重定向stdout到虚无的任何命令的末尾重击即可。输出的内容stderr仍将显示在控制台中。

$ sudo apt-get update > /dev/null
[sudo] password for oli: 
$ 
Run Code Online (Sandbox Code Playgroud)

没有垃圾!如果我们很愚蠢并破坏了某些东西,会发生以下情况:

$ apt-get cheese > /dev/null
E: Invalid operation cheese
$
Run Code Online (Sandbox Code Playgroud)

  • 如果你得到提示,那有点问题...... (7认同)
  • @Oli 如果你绝对确定你不会让你的系统着火,你总是可以`sudo apt-get upgrade -qq --force-yes &gt; /dev/null`。正如 WulfHart 所说,`-qq` 暗示了 `-y`,而 `--force-yes` 使它几乎可以通过任何东西。 (6认同)
  • 这不是问题的答案;这是一种解决方法。 (3认同)
  • @Vorac 不,它只是重定向`stdout`(IMO 看到错误是一件可取的事情)。 (2认同)

小智 6

正如您在此处此处所看到的,
您可以执行以下操作:

export DEBIAN_FRONTEND=noninteractive
apt-get -yq install [packagename]
export DEBIAN_FRONTEND=dialog
Run Code Online (Sandbox Code Playgroud)

或者一行:

DEBIAN_FRONTEND=noninteractive apt-get -yq install [packagename]
Run Code Online (Sandbox Code Playgroud)