Как скрыть вывод команды в Bash

Я хочу сделать мои сценарии Bash более элегантными для конечного пользователя. Как скрыть вывод, когда Bash выполняет команды?

Например, когда Bash выполняет

yum install nano

Следующее будет отображаться пользователю, выполнившему Bash:

Loaded plugins: fastestmirror
base                                                     | 3.7 kB     00:00
base/primary_db                                          | 4.4 MB     00:03
extras                                                   | 3.4 kB     00:00
extras/primary_db                                        |  18 kB     00:00
updates                                                  | 3.4 kB     00:00
updates/primary_db                                       | 3.8 MB     00:02
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package nano.x86_64 0:2.0.9-7.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package         Arch              Version                Repository       Size
================================================================================
Installing:
 nano            x86_64            2.0.9-7.el6            base            436 k

Transaction Summary
================================================================================
Install       1 Package(s)

Total download size: 436 k
Installed size: 1.5 M
Downloading Packages:
nano-2.0.9-7.el6.x86_64.rpm                              | 436 kB     00:00
warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Importing GPG key 0xC105B9DE:
 Userid : CentOS-6 Key (CentOS 6 Official Signing Key) <[email protected]>
 Package: centos-release-6-4.el6.centos.10.x86_64 (@anaconda-CentOS-201303020151.x86_64/6.4)
 From   : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : nano-2.0.9-7.el6.x86_64                                      1/1
  Verifying  : nano-2.0.9-7.el6.x86_64                                      1/1

Installed:
  nano.x86_64 0:2.0.9-7.el6

Complete!

Теперь я хочу скрыть это от пользователя и вместо этого показать:

    Installing nano ......

Как я могу выполнить эту задачу? Я обязательно помогу сделать скрипт более удобным. В случае возникновения ошибки ее следует показать пользователю.

Я хотел бы знать, как показать одно и то же сообщение при выполнении набора команд.


person user2650277    schedule 05.08.2013    source источник
comment
См. stackoverflow.com/questions/617182/   -  person Jaffar Ramay    schedule 05.08.2013
comment
Возможный дубликат Как подавить весь вывод команды с помощью Баш?   -  person Ulrich Eckhardt    schedule 26.08.2019


Ответы (8)


Использовать этот.

{
  /your/first/command
  /your/second/command
} &> /dev/null

Объяснение

Чтобы исключить вывод команд, у вас есть два варианта:

  • Закройте файл дескриптора вывода, чтобы он больше не принимал ввод. Это выглядит так:

    your_command "Is anybody listening?" >&-
    

    Обычно вывод идет либо в файловый дескриптор 1 (stdout), либо в 2 (stderr). Если вы закроете файловый дескриптор, вам придется сделать это для каждого пронумерованного дескриптора, поскольку &> (ниже) - это специальный синтаксис BASH, несовместимый с >&-:

    /your/first/command >&- 2>&-
    

    Обратите внимание на порядок: >&- закрывает стандартный вывод, т. Е. что ты хочешь делать; &>- перенаправляет stdout и stderr в файл с именем - (дефис), а это не то, что вы хотите делать. Сначала он будет выглядеть так же, но последний создает случайный файл в вашем рабочем каталоге. Легко запомнить: >&2 перенаправляет стандартный вывод на дескриптор 2 (stderr), >&3 перенаправляет стандартный вывод на дескриптор 3, а >&- перенаправляет стандартный вывод в тупик (т.е. закрывает стандартный вывод).

    Также имейте в виду, что некоторые команды могут не особенно хорошо обрабатывать закрытый файловый дескриптор («ошибка записи: неверный файловый дескриптор»), поэтому лучшим решением может быть ...

  • Перенаправить вывод на /dev/null, который принимает весь вывод и ничего не делает с ним. Выглядит это так:

    your_command "Hello?" > /dev/null
    

    Для перенаправления вывода в файл вы можете очень кратко направить как stdout, так и stderr в одно и то же место, но только в bash:

    /your/first/command &> /dev/null
    

Наконец, чтобы сделать то же самое для нескольких команд одновременно, заключите все в фигурные скобки. Bash рассматривает это как группу команд, объединяя дескрипторы выходного файла, чтобы вы может перенаправить все сразу. Если вы знакомы с подоболочками, использующими синтаксис ( command1; command2; ), вы обнаружите, что фигурные скобки ведут себя почти так же, за исключением того, что, если вы не включите их в канал, фигурные скобки не будут создавать подоболочку и, таким образом, позволят вам устанавливать переменные внутри .

{
  /your/first/command
  /your/second/command
} &> /dev/null

Дополнительные сведения, параметры и синтаксис см. В руководстве bash по перенаправлениям.

person Jeff Bowman    schedule 05.08.2013
comment
Привет, я знаю, что это старый вопрос, но можно ли сделать то же самое при определенных условиях? Как я хочу скрыть вывод при определенных условиях? Я знаю, что могу воспроизвести ту же часть в if-else, но есть ли лучший способ сделать это? - person usamazf; 06.04.2018
comment
@UsamaZafar Я бы сделал это, установив переменную (параметр оболочки), который вы установили в /dev/null или /dev/stdout (или /path/to/a/logfile) условно ранее в сценарии, а затем перенаправили в этот пункт назначения с помощью &> $output_dest (или как вы его называете). Если вы не хотите комбинировать stdout и stderr в этом случае, вы можете перенаправить их по отдельности, например > $output_dest 2> $errors_dest. - person Jeff Bowman; 06.04.2018
comment
Понятия не имею, что это было целью подтяжек. - person GrapeApple; 26.04.2021

Вы можете перенаправить stdout в / dev / null.

yum install nano > /dev/null

Или вы можете перенаправить как stdout, так и stderr,

yum install nano &> /dev/null.

Но если в программе есть тихий вариант, это даже лучше.

person ktm5124    schedule 05.08.2013

Обычно процесс имеет два вывода на экран: stdout (стандартный вывод) и stderr (стандартная ошибка).

Обычно информационные сообщения отправляются на sdout, а сообщения об ошибках и предупреждения отправляются на stderr.

Вы можете выключить stdout для команды, выполнив

MyCommand >/dev/null

и выключите stderr, выполнив:

MyCommand 2>/dev/null

Если вы хотите отключить оба, вы можете:

MyCommand 2>&1 >/dev/null

2>&1 говорит, что отправьте stderr в то же место, что и stdout.

person LeOn - Han Li    schedule 31.05.2017

Вы можете перенаправить вывод на /dev/null. Для получения дополнительной информации о / dev / null прочтите эту ссылку.

Вы можете скрыть вывод команды следующими способами:

echo -n "Installing nano ......"; yum install nano > /dev/null; echo " done."; 

Перенаправьте стандартный вывод на /dev/null, но не на стандартную ошибку. Это покажет ошибки, возникающие во время установки, например, если yum не может найти пакет.

echo -n "Installing nano ......"; yum install nano &> /dev/null; echo " done.";

Хотя этот код ничего не покажет в терминале, поскольку и стандартная ошибка, и стандартный вывод перенаправляются и, таким образом, обнуляются на /dev/null.

person Giuseppe Pes    schedule 05.08.2013
comment
Отличная публикация .... чувак, ты можешь показать мне, как вывести одно и то же сообщение только один раз для набора команд - person user2650277; 05.08.2013

>/dev/null 2>&1 отключит звук как stdout, так и stderr

yum install nano >/dev/null 2>&1
person Quanlong    schedule 16.06.2015

В этом случае вы не должны использовать bash, чтобы избавиться от вывода. У Yum есть опция -q, которая подавляет вывод.

Вы, безусловно, также захотите использовать -y

echo "Installing nano..."
yum -y -q install nano

Чтобы увидеть все варианты yum, используйте man yum.

person kkeller    schedule 25.02.2014
comment
Спасибо, я предположил, что у yum есть один, так как apt-get used -qq также подавляет. Это было полезно для того, что я делаю. - person Hyperion; 25.09.2015

.SILENT:

Введите ".SILENT:" в начале вашего скрипта без двоеточий.

person Arif    schedule 09.03.2018

вы также можете сделать это, назначив его вывод переменной, это особенно полезно, когда у вас нет /dev/null.

Да, столкнулся с ситуацией, когда не могу использовать /dev/null.

Решение, которое я нашел, заключалось в том, чтобы назначить вывод переменной, которую я больше никогда не буду использовать:

hide_output=$([[ -d /proc ]] && [[ mountpoint -q /proc ]] && umount -l /proc)
person DeanSinaean    schedule 20.04.2021