Подтвердить что ты не робот

Как скрыть вывод команды в 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 ......

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

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

4b9b3361

Ответ 1

Используйте это.

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

Объяснение

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

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

    your_command "Is anybody listening?" >&-
    

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

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

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

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

  • Перенаправить вывод на /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 руководстве по перенаправлениям.

Ответ 2

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

yum install nano > /dev/null

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

yum install nano &> /dev/null.

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

Ответ 3

Вы можете перенаправить вывод на /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.

Ответ 4

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

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

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

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

Ответ 5

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

yum install nano >/dev/null 2>&1

Ответ 6

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

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

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

MyCommand >/dev/null

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

MyCommand 2>/dev/null

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

MyCommand 2>&1 >/dev/null

2>&1 сообщает send stderr в том же месте, что и stdout.