Bashでコマンド出力を非表示にする方法 質問する

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

このタスクをどのように達成できますか? スクリプトをよりユーザーフレンドリーにするために、私は間違いなく協力します。エラーが発生した場合は、ユーザーに表示される必要があります。

一連のコマンドが実行されている間に同じメッセージを表示する方法を知りたいです。

ベストアンサー1

これを使って。

{
  /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 を (ハイフン) という名前のファイルにリダイレクトしますが-、これは実行したい操作ではありません。一見同じように見えますが、後者は作業ディレクトリに別のファイルを作成します。覚えやすいです。stdout を>&2記述子 2 (stderr) にリダイレクトし、>&3stdout を記述子 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 マニュアル詳細、オプション、および構文については、こちらをご覧ください。

おすすめ記事