Я хочу сделать мои сценарии 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) <centos-6-key@centos.org>
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 ......
Как я могу выполнить эту задачу? Я обязательно помогу сделать скрипт более удобным. В случае возникновения ошибки ее следует показать пользователю.
Я хотел бы знать, как показать одно и то же сообщение при выполнении набора команд.
echo "Installing nano ......"; yum install nano &> /dev/null
Ответы:
Использовать это.
Объяснение
Чтобы исключить вывод команд, у вас есть два варианта:
Закройте файл дескриптора вывода, чтобы он больше не принимал ввод. Это выглядит так:
Обычно вывод идет либо в файловый дескриптор 1 (stdout), либо в 2 (stderr). Если вы закроете файловый дескриптор, вам придется сделать это для каждого пронумерованного дескриптора, поскольку
&>
(ниже) это специальный синтаксис BASH, несовместимый с>&-
:Обратите внимание на порядок:
>&-
закрывает stdout , что вы и хотите сделать;&>-
перенаправляет stdout и stderr в файл с именем-
(дефис), а это не то, что вы хотите делать. Сначала он будет выглядеть так же, но последний создает случайный файл в вашем рабочем каталоге. Это легко запомнить:>&2
перенаправляет stdout на дескриптор 2 (stderr),>&3
перенаправляет stdout на дескриптор 3 и>&-
перенаправляет stdout в тупик (т.е. закрывает stdout).Также имейте в виду, что некоторые команды могут не особенно хорошо обрабатывать закрытый файловый дескриптор («ошибка записи: плохой файловый дескриптор»), поэтому лучшим решением может быть ...
Перенаправить вывод на
/dev/null
, который принимает весь вывод и ничего с ним не делает. Выглядит это так:Для перенаправления вывода в файл вы можете очень кратко направить как stdout, так и stderr в одно и то же место, но только в bash:
Наконец, чтобы сделать то же самое для нескольких команд одновременно, заключите все это в фигурные скобки. Bash рассматривает это как группу команд , объединяющих дескрипторы выходного файла, чтобы вы могли перенаправить все сразу. Если вы знакомы с подоболочками с использованием
( command1; command2; )
синтаксиса, вы обнаружите, что фигурные скобки ведут себя почти так же, за исключением того, что, если вы не включите их в канал, фигурные скобки не будут создавать подоболочку и, таким образом, позволят вам устанавливать переменные внутри.См. Руководство bash по перенаправлениям для получения более подробной информации, параметров и синтаксиса.
источник
/dev/null
или/dev/stdout
(или/path/to/a/logfile
) условно ранее в скрипте, а затем перенаправлял к этому месту назначения с помощью&> $output_dest
(или как вы его называете). Если вы не хотите комбинировать stdout и stderr в этом случае, вы можете перенаправить их отдельно, например> $output_dest 2> $errors_dest
.Вы можете перенаправить stdout в / dev / null.
yum install nano > /dev/null
Или вы можете перенаправить как stdout, так и stderr,
yum install nano &> /dev/null
.Но если в программе есть тихий вариант, это даже лучше.
источник
Обычно процесс имеет два вывода на экран: stdout (стандартный вывод) и stderr (стандартная ошибка).
Обычно информационные сообщения отправляются по
sdout
адресу, а сообщения об ошибках и предупреждения - по адресуstderr
.Вы можете выключить
stdout
команду, выполниви выключите
stderr
, выполнив:Если вы хотите отключить оба , вы можете:
Команда
2>&1
говорит отправить stderr в то же место, что и stdout.источник
Вы можете перенаправить вывод в
/dev/null
. Для получения дополнительной информации о / dev / null прочтите эту ссылку .Вы можете скрыть вывод команды следующими способами:
Перенаправьте стандартный вывод
/dev/null
, но не на стандартную ошибку. Это покажет ошибки, возникающие во время установки, например, еслиyum
не удается найти пакет.Хотя этот код ничего не покажет в терминале, поскольку и стандартная ошибка, и стандартный вывод перенаправляются и, таким образом, обнуляются в
/dev/null
.источник
>/dev/null 2>&1
отключит обаstdout
иstderr
источник
В этом случае вы не должны использовать bash, чтобы избавиться от вывода. У Yum есть опция,
-q
которая подавляет вывод.Вы наверняка захотите использовать
-y
Чтобы увидеть все варианты yum, используйте
man yum
.источник
Введите ".SILENT:" в начале вашего скрипта без двоеточий.
источник