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

-qq No output except for errors


相反,我得到:

以及更多...

实际上,有几百行输出。这似乎与no output except for errors不匹配。

如何真正使apt-get install仅在无法安装时出现错误时打印?

评论

您是否尝试过使用-q =#,其中#是安静级别? (在手册中。)您可能要针对此提出错误报告。

@PaddyLandau我确实做到了。我不知道为什么要谈论选择以前未选择的程序包,或者为什么这很重要,而且我不确定它是否与vm的状态有关,我在travis-ci上的这些程序上运行它。但是答案很好。

“选择先前未选择的程序包”仅表示程序包管理器包括满足依赖关系所需的程序包。如我先前所写,您可能想提出有关--quiet选项似乎无法正常工作的错误报告。

我很不高兴地报告说,同一症状在Ubuntu 15.04 20150709.

看起来与2009年dpkg问题报告有关:bugs.debian.org/cgi-bin/bugreport.cgi?bug=539617。

#1 楼

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}}


-q-qq标志应放在命令之前,例如:

apt-get -qq upgrade

评论


这是正确的答案!任何实际的实现都需要保留提示。正确使用-q绝对有效(无“动画”输出),以及-qq(无错误则无输出)。请投票!

– Charney Kaye
15年8月19日在19:18

不,它不起作用。即使在安装命令之前使用-qq,从读取数据库到解压缩和设置消息,我仍然会遇到很多麻烦。

–CrazyCasta
16年6月20日在23:55

好吧,我试过了sudo apt-get -qq -y install mercurial,sudo apt-get install -qq -y mercurial,sudo apt-get qq install -qq -y mercurial和其他涉及甚至更多q的变化(尽管我我没有在Google Cloud btw(8)上运行Debian Jessie。我也尝试过Goetz的答案,但它似乎也不起作用。我的意思是我没注意到有什么不同。

–CrazyCasta
16年6月22日在15:49

这是Ubuntu 16.04.1,作为Docker容器运行。我的猜测是消息实际上来自dpkg,由apt-get调用。命令为apt-get -qq更新&& apt-get -qq升级&& apt-get -qq install build-essential。见gist.github.com/stefanlasiewski/…

– Stefan Lasiewski
16 Dec 8'在19:13



在Docker中,您有2种选择:(1)分别运行每个命令,而不用&&连接它们(可能会起作用,但这不是“ docker方式”)(2)像其他答案一样将输出重定向到/ dev / null。如果存在此错误,选项2可能是最好的选择。

–迈克
16 Dec 9'在8:44

#2 楼

我们面临着同样的问题。 apt-get install -qq删除了大多数输出​​,但令人讨厌的“(正在读取数据库...”仍然存在。

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

apt-get install -qq -o=Dpkg::Use-Pty=0 <packages>


可以帮助别人的期望。

评论


实际上,这是完全正确的答案。它还允许使用-q运行apt-get并看到一些输出,而不会看到烦人的“读取数据库”

–valodzka
2015年9月30日在20:26

我正在gcloud debian jessie(8)上尝试此操作,但仍然可以读取数据库行并解包/设置行。

–CrazyCasta
16年6月21日,0:09

此答案不适用于Ubuntu 18.04。

– Amedee Van Gasse
18年5月10日在16:06

还有很多选择/准备/设置线...

– Hayd
19年1月5日在23:03

-o = Dpkg :: Use-Pty = 0在Ubuntu 18.04上完美运行。它仅显示一个“读取数据库”,而不是多个,每5%更新一次进度。

– Wisbucky
19年7月18日在22:24

#3 楼

一个简单的重定向可以做到这一点。我敢肯定,这与您的想法并不完全相同,但是可以确保它在地狱中正常工作。变成虚无。在> /dev/null上输出的内容仍将显示在控制台中。

$ sudo apt-get update > /dev/null
[sudo] password for oli: 
$ 


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

$ apt-get cheese > /dev/null
E: Invalid operation cheese
$


评论


如果您得到提示,那会有点问题...

–l0b0
13年2月19日在16:44

如果这是脚本的一部分,则不会在apt-get前面放一个sudo。相反,您只需要在运行脚本时使用sudo即可。

– Xion
13年2月19日在16:49

@Oli如果您绝对确定不会使系统着火,则可以始终使用sudo apt-get upgrade -qq --force-yes> / dev / null。正如WulfHart所说,-qq表示-y,而--force-yes则使它几乎穿过所有东西。

–JamesTheAwesomeDude
13年2月26日在13:46

@Vorac不,它只是重定向标准输出(看到错误是IMO所希望的)。

–奥利♦
13 Mar 27 '13 at 13:34

这不是问题的答案;这是一种解决方法。

– Charney Kaye
15年8月19日在19:19



#4 楼

正如您在此处和此处看到的那样
您可以执行以下操作:

export DEBIAN_FRONTEND=noninteractive
apt-get -yq install [packagename]
export DEBIAN_FRONTEND=dialog


或一行:

DEBIAN_FRONTEND=noninteractive apt-get -yq install [packagename]


#5 楼

使用apt-get -qq install -y PACKAGE 2> /dev/null可以:

仅显示-qq的错误。
将错误发送到/dev/null(未显示),以便可以安装输出为零的软件包。


#6 楼

您可以使用python脚本对每个命令的stdout和stderr进行任何操作。例如,如果要查看仅包含输出最后一行的动态输出,则可以使用以下脚本:

#!/usr/bin/python3
import subprocess, sys
process = subprocess.Popen(sys.argv[1:], stdout=subprocess.PIPE)
while process.poll() is None:
  stdout = process.stdout.readline().decode()[:-1]
  print(stdout,end='\r')
print()


如果您知道如何工作使用python中的字符串,您可以调整脚本以仅以任何希望的格式打印要打印的行。

将上述代码保存在文件中,例如run.py。然后,您可以运行任何命令以动态地仅查看输出的最后一行。例如:

./run.py sudo apt-get install <package>


或:

./run.py sudo apt-get update



注1:不要忘记授予exec脚本权限:

chmod +x run.py



注2:您可以进行适当的符号链接以更方便地使用(或添加脚本路径)到$ PATH环境变量(我不建议这样做):

sudo ln -s <path/to/yourscript.py> /usr/bin/run


之后,您只能使用:

run <command-with-desired-output-format>