Як приховати вихідні дані команди в Bash


99

Я хочу зробити свої сценарії 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 ......

Як я можу виконати це завдання? Я точно допоможу зробити сценарій більш зручним для користувача. У разі виникнення помилки, її слід показати користувачеві.

Я хотів би знати, як показувати одне і те ж повідомлення під час виконання набору команд.


4
echo "Installing nano ......"; yum install nano &> /dev/null
user000001


Відповіді:


246

Використовуй це.

{
  /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).

    Також майте на увазі, що деякі команди можуть не особливо добре обробляти дескриптор закритого файлу ("помилка запису: Поганий дескриптор файлу"), саме тому кращим рішенням може бути ...

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


Привіт, я знаю, це старе запитання, але чи можна те саме зробити умовно? Мовляв, я хочу приховати вихідні дані за певних умов? Я знаю, що можу повторити ту саму частину під if-else, але чи є кращий спосіб це зробити?
usamazf

@UsamaZafar Я б зробив це, встановивши змінну ( "параметр оболонки" ), яку ви встановили або /dev/nullабо /dev/stdout(або /path/to/a/logfile) умовно раніше в сценарії, а потім перенаправив у цей пункт призначення за допомогою &> $output_dest(або як би ви його не назвали). Якщо ви не хочете поєднувати stdout та stderr у такому випадку, ви можете перенаправити їх окремо, наприклад > $output_dest 2> $errors_dest.
Джефф Боумен,

35

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

yum install nano > /dev/null

Або ви можете перенаправити як stdout, так і stderr,

yum install nano &> /dev/null.

Але якщо програма має тихий варіант, це ще краще.


23

Процес зазвичай має два виходи для екранування: stdout (стандартний вихід) і stderr (стандартна помилка).

Зазвичай інформаційні повідомлення надходять на sdout, а помилки та попередження - на stderr.

Ви можете вимкнути stdoutкоманду, виконавши

MyCommand >/dev/null

і вимкніть stderr, виконавши:

MyCommand 2>/dev/null

Якщо ви хочете вимкнути обидва варіанти , ви можете зробити:

MyCommand 2>&1 >/dev/null

2>&1Каже відправити STDERR в тому ж місці, на стандартний висновок.


8

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


1
Чудова частка .... чувак, ти можеш показати мені, як вивести одне і те ж повідомлення лише один раз для набору команд
user2650277


4

Ви не повинні використовувати bash в цьому випадку, щоб позбутися результату. Yum дійсно має опцію, -qяка придушує вихід.

Ви, безсумнівно, також захочете використовувати -y

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

Щоб переглянути всі варіанти yum, використовуйте man yum.


Дякую, я припустив, що у yum був такий, оскільки apt-get used -qq, а також для придушення. Це було корисно для того, що я роблю.
Hyperion

0
.SILENT:

Введіть ".SILENT:" на початку сценарію без двокрапки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.