Bashを使用してコマンドからのすべての出力を抑制するにはどうすればよいですか?


296

パラメータを使用してプログラムを実行するBashスクリプトがあります。そのプログラムはいくつかのステータスを出力します(これを行っている、行っている...)。このプログラムを静かにするオプションはありません。スクリプトが何も表示しないようにするにはどうすればよいですか?

Windowsの「エコーオフ」のようなものを探しています。

回答:


510

次の例では、標準出力をnullデバイス(ビットバケット)に送信します。

scriptname >/dev/null

エラーメッセージもそこに送信する場合は、次のいずれかを使用します(最初のシェルはすべてのシェルで機能しない場合があります)。

scriptname &>/dev/null
scriptname >/dev/null 2>&1
scriptname >/dev/null 2>/dev/null

また、メッセージを記録したいが表示しない場合は/dev/null、次のような実際のファイルに置き換えます。

scriptname &>scriptname.out

完全を期すために、Windows cmd.exe(「nul」は「/ dev / null」に相当)の下では、次のようになります。

scriptname >nul 2>nul

8
'&>'はbash(およびおそらくCシェル)に固有であることに注意してください。KornシェルおよびBourneシェルには、2> / dev / nullまたは2>&1が必要です(stderrをstdoutと同じ場所に送信するため)。Kornシェルは、「&>」を「バックグラウンドで&まで実行してから、空のコマンドでI / Oリダイレクトを行う」と解釈するようです。
ジョナサンレフラー

2
一部のコマンドは、標準出力/エラーではなく端末デバイスに直接書き込みます。テストするにecho foo > $(tty)は、スクリプトを入力して実行します./test.sh &> /dev/null-出力は引き続きターミナルに出力されます。もちろん、そのようなコマンドを使用しないスクリプトを作成している場合は問題ありません。
l0b0 2013

1
@ l0b0、スクリプト(または他のプログラム)のttyを変更して、例に関係なくすべての出力がリダイレクトされるようにする方法はありますか?画面とスクリプトはそのようなことを実行できることを知っていますが、どちらも気が利いていて、* nixから* nixまでさまざまです。
ブレント

@yang /dev/nullはCygwinに存在するため、を使用する必要はありませんnul
dimo414

47

何かのようなもの

script > /dev/null 2>&1

これにより、標準出力エラー出力が防止され、両方がにリダイレクトされます/dev/null


5
また、いくつかのタイピングを保存したい場合は、単に&>でも実現します;)
andynormancx 2009年

1
これをgs(GhostScript)コマンドに追加しても、出力されます****警告:ファイルに%% EOFマーカーが壊れているか、%% EOFの後にガベージがあります。何かアドバイス?
ZurabWeb 2014年

これはunixシステムではプロセスを実行しません。私は実行する必要がありました2>/dev/null
アルパー

13

試す

: $(yourcommand)

: 「何もしない」の略です。

$() あなたの命令です。


3
非常に興味深いですが、制限があり0ます。返されるステータスコードは常に(成功)です。false常に1(失敗)を返すコマンドを使用した例を見てみましょう。たとえばが( echo foo | tee file ; false ) && echo bar表示されますfoo。トリックを使用して出力を抑制します( : $(echo foo | tee file ; false) ) && echo bar。ただしbar、戻りステータスコードは0(これはからの戻りステータスコードではありません)という意味falseです。この制限を提供して回答を更新してください。乾杯
olibre 2015年

2
@olibre、どうDUMMY=$(yourcommand)ですか?あなたが述べた制限はありません。:)
semente 2016年

3
@sementeパーフェクト:コマンドDUMMY=$( echo foo | tee file ; false ) && echo barは何も表示しません。そして、コマンドがDUMMY=$( echo foo | tee file ; true ) && echo bar表示されますbar。それを
賛成

9

状況によっては、代替案として、コマンドの結果を変数に割り当てる方法があります。

$ DUMMY=$( grep root /etc/passwd 2>&1 )
$ echo $?
0
$ DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
1

Bashおよび他のPOSIXコマンドラインインタープリターは変数の割り当てをコマンドと見なさないため、現在のコマンドの戻りコードが尊重されます。

注:typeset or declareキーワードを使用した代入はコマンドと見なされるため、ケースで評価される戻りコードは代入自体であり、サブシェルで実行されるコマンドではありません。

$ declare DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
0

6

andynormancxのpostと同様に、これを使用します(UNIX環境で作業している場合)。

scriptname > /dev/null

または、これを使用できます(Windows環境で作業している場合)。

scriptname > nul

1
実際には、Windowsシェルの場合よりも優れています。代わりに「scriptname> nul」を使用すると、「nul」はWindowsの/ dev / nullに相当するため、削除するファイルすらありません。
andynormancx 2009年

1
@andynormancx:Windowsファイルシステムのレイアウトについて私が嫌いなのはそれです。NUL、COM1、LPT1、CONなどのファイル名を「予約」します(ネットワーク共有のように、それらのファイル名を持つことができるファイルシステムにいる場合でも)。
dreamlax 2009年

DOS 5.x以降、実際にNULを使用したことはないと思います。この答えを見たとき、突然記憶に
残りました

> nulWindowsでcygwinまたはgit bash を使用していて、nul削除できないファイルが表示されている場合は、この答えを試してみてください。これは魅力のように機能しました。
デーモンペインター

4

Linux Documentation Projectからこの例を見てください。

3.6サンプル:stderrおよびstdout 2ファイル

これにより、プログラムのすべての出力がファイルに配置されます。これは、コマンドに完全な無音を渡す必要がある場合に、cronエントリに適しています。

     rm -f $(find / -name core) &> /dev/null 

つまり、この単純なリダイレクトを使用できます。

/path/to/command &>/dev/null

1

スクリプトでは、出力を行うことがわかっている行に以下を追加できます。

some_code 2>>/dev/null

または、あなたも試すことができます

some_code >>/dev/null

1
>>を/ dev / nullに見たことがない...好奇心から..なぜこれをしているのですか?
Florian Berndl

すべての出力を抑制していますか?
Peter Mortensen

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