Как скрыть вывод команды в 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 более удобным для пользователя. В случае возникновения ошибки он должен быть показан пользователю.
Редактировать Я хотел бы знать, как показывать такое же сообщение, пока выполняется набор команд
Ответы
Ответ 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.