Если я использую apt-get install -qq mono-devel
, Я ожидаю, что это будет тихо за исключением ошибок, согласно справке:
-qq No output except for errors
Вместо этого я добираюсь:
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.
и больше...
На самом деле, пара сотни ценности строк вывода. Это, кажется, не совпадает с no output except for errors
.
Как я на самом деле добираюсь apt-get install
распечатать только, когда существуют ошибки, мешающие этому установить?
Man page for 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
Это можно сделать с помощью простого перенаправления. Я уверен, что это не совсем то, что вы имели в виду, но он чертовски работает :)
Короче говоря, просто ударьте > / dev / null
в конце любой команды, где хотите перенаправить весь stdout
в ничто. То, что выводится на stderr
, все равно будет отображаться в консоли.
$ sudo apt-get update > /dev/null
[sudo] password for oli:
$
Никакого мусора! И вот что произойдет, если мы будем глупыми и что-то сломаем:
$ apt-get cheese > /dev/null
E: Invalid operation cheese
$
Мы столкнулись с той же проблемой. apt-get install -qq
удаляет большую часть выходных данных, но раздражающее «(Чтение базы данных ...» все еще сохраняется.
Мы просмотрели исходный код apt и обнаружили, что выходные данные создаются с помощью dpkg, который был разветвлен apt. Затем источник dpkg показывает, что раздражающий soutput выдается только тогда, когда isatty (1) имеет значение true. Это только тот случай, когда вилка использует pty вместо pipe. Возвращаясь к apt, есть недокументированная конфигурация переменная, которая позволяет использовать канал вместо pty, что затем решает проблему:
apt-get install -qq -o=Dpkg::Use-Pty=0 <packages>
Ожидая, что это может помочь другим.
Как вы можете видеть здесь и здесь
Вы можете:
export DEBIAN_FRONTEND=noninteractive
apt-get -yq install [packagename]
export DEBIAN_FRONTEND=dialog
Или одна строка:
DEBIAN_FRONTEND=noninteractive apt-get -yq install [packagename]
Вы можете использовать скрипт 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>
С apt-get -qq install -y ПАКЕТ 2> / dev / null
вы можете:
-qq
. / dev / null
(не показано), чтобы вы могли установить пакет с нулевым выводом. Для меня это отлично работает для полностью бесшумного / нулевого выхода при установке причина NULL STDIN и STDOUT.
DEBIAN_FRONTEND=noninteractive apt-get install -qq [packagename] < /dev/null > /dev/null
Надеюсь, это поможет !!