1. ホーム
  2. bash

[解決済み] Bashでコマンド出力を隠す方法

2022-07-27 01:20:03

質問

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

どうすればこのタスクを達成できるでしょうか?スクリプトをより使いやすくするために、ぜひお手伝いさせてください。エラーが発生した場合、ユーザーに表示される必要があります。

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

どのように解決するのですか?

これを使います。

{
  /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 は標準出力を記述子 2 (stderr) にリダイレクトします。 >&3 は標準出力をディスクリプタ 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 のリダイレクトに関するマニュアルを参照してください。 を参照してください。