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 2013


回答:


246

これを使って。

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

説明

コマンドからの出力を排除するには、2つのオプションがあります。

  • 出力記述子ファイルを閉じて、それ以上の入力を受け入れないようにします。これは次のようになります。

    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で複製できることはわかっていますが、より良い方法はありますか?
Usama Zafar

私は、変数(設定することで、それを行うだろう@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

通常、プロセスには画面に2つの出力があります。stdout(標準出力)とstderr(標準エラー)です。

通常、情報メッセージはに送信されsdout、エラーとアラートはに送信されますstderr

stdoutコマンドをオフにすることができます

MyCommand >/dev/null

次のようにしてオフstderrにします。

MyCommand 2>/dev/null

両方をオフにしたい場合は、次のことができます。

MyCommand 2>&1 >/dev/null

2>&1標準出力と同じ場所に標準エラー出力を送ると言います。


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.";

標準エラーと標準出力の両方がリダイレクトされるため、このコードはターミナルに何も表示しませんが、nullにされ/dev/nullます。


1
素晴らしい共有.... dudeコマンドセットに対して同じメッセージを1回だけ出力する方法を教えてください
user2650277

5

>/dev/null 2>&1両方をミュートしstdoutstderr

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

4

この場合、出力を取り除くためにbashを使用しないでください。Yumには-q、出力を抑制するオプションがあります。

あなたも間違いなく使いたいでしょう -y

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

yumのすべてのオプションを表示するには、を使用しますman yum


おかげで、apt-getが-qqを使用して抑制したので、yumに1つあると想定しました。これは私がやっていることに役立ちました。
Hyperion

0
.SILENT:

コロンなしでスクリプトの最初に「.SILENT:」と入力します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.