Bashスクリプトの出力を無音にする方法は?


149

stdoutに出力するプログラムがあり、ファイルにパイプしている間、その出力をBashスクリプトで黙らせたいと思っています。

たとえば、プログラムを実行すると次のように出力されます。

% myprogram
% WELCOME TO MY PROGRAM
% Done.

次のスクリプトが端末に何も出力しないようにしたいのですが。

#!/bin/bash
myprogram > sample.s

私が覚えていることから、出力をファイルにリダイレクトすると、ターミナルにエコーされなくなります。何がうまくいかないのですか?
アノン。


回答:


187

それがstderrにも出力する場合は、それを沈黙させる必要があります。これは、ファイル記述子2をリダイレクトすることで実行できます。

# Send stdout to out.log, stderr to err.log
myprogram > out.log 2> err.log

# Send both stdout and stderr to out.log
myprogram &> out.log      # New bash syntax
myprogram > out.log 2>&1  # Older sh syntax

# Log output, hide errors.
myprogram > out.log 2> /dev/null

15
"&>"行は、先ほど投稿したものの短いバージョンです。私はそのショートカットに出会ったことがありません。賛成票。
chradcliffe、2010

5
&>bashの4より多くの古い
イグナシオバスケス-エイブラムスは、

@ IgnacioVazquez-Abrams変更履歴のドキュメント&>の紹介をリンクできますか?:o
ThorSummoner 2015年

1
git.savannah.gnu.org/cgit/bash.git/tree/CHANGES#n2208>>&、4.0で導入されたことを示しています。言及はありません&>が、変更点は2.0に戻るだけなので、それはすでに1.xにあったことを意味します。
tripleee 2016年

git blame上のredir.c1998点現在のコードベースに依然として最も古い発生をコミット。
tripleee 2016年

60

stderrをstdoutにリダイレクトする

これにより、stderr(記述子2)がstdoutであるファイル記述子1にリダイレクトされます。

2>&1

stdoutをファイルにリダイレクト

これを実行すると、標準出力をファイルにリダイレクトします sample.s

myprogram > sample.s

stderrとstdoutをファイルにリダイレクトする

2つのコマンドを組み合わせると、stderrとstdoutの両方がsample.sにリダイレクトされます。

myprogram > sample.s 2>&1

stderrとstdoutを/ dev / nullにリダイレクトします

/dev/nullアプリケーションを完全にサイレントにする場合は、にリダイレクトします。

myprogram >/dev/null 2>&1

13
最後のものにはリダイレクト演算子がありません。myprogram >/dev/null 2>&1(前のウェッジ/dev/nullとリダイレクトの順序に注意してください)。
tripleee 2016年

2
myprogram &>/dev/null十分ではないでしょうか?
JaviOverflow

38

すべての出力:

scriptname &>/dev/null

ポータブル:

scriptname >/dev/null 2>&1

ポータブル:

scriptname >/dev/null 2>/dev/null

新しいbashの場合(移植不可):

scriptname &>-

これは機能しません。という名前のファイルを実際に作成しますが-、これ&>は移植できないbourneシェル拡張です。
PhilT 2014

ポータブル同等のecho moo 1>&-ファイルディスクリプタ1が閉じているため、エラーを生成します:-bash: echo: write error: Bad file descriptor
tripleee

11

STDOUTとSTDERRの両方[すべて]が必要な場合、最も簡単な方法は次のとおりです。

#!/bin/bash
myprogram >& sample.s

次にのよう./scriptに実行すると、端末に出力が得られません。:)

">&"はSTDERRおよびSTDOUTを意味します。&:また、パイプと同じように動作します./script |& sed SEDにすべてを送信します


7
man bash(「標準出力と標準エラーのリダイレクト」の下)は、&>と>&は同等ですが、最初の(&>)が推奨されます。ただし、|&がパイプに対してこれを行う唯一の方法です。
John Mellor

1
@ジョンいいえ、パイプの移植方法があるa 2>&1 | b 2>&1 | c
tripleee

9

それでも答えを見つけるのに苦労している場合、特に出力用のファイルを作成した場合で、明確な代替手段が必要な場合: echo "hi" | grep "use this hack to hide the oputut :) "


2
興味深いハック...賢さへの賛成^ _ ^
skplunkerin 2017


0

注:この回答は、「Linuxのシェルスクリプトの実行中にエコーをオフにする方法」という質問に関連しています。

エコーを実際にオフにするには、コマンドは次のとおりです。

stty -echo

(これは、たとえば、パスワードを入力したくて読めたくない場合です。スクリプトの最後でエコーをオンにすることを忘れないでください。そうしないと、スクリプトを実行する人は何を見ることができません。 /彼女はその後から入力します。実行時にエコーをオンにするには:

stty echo


0

スクリプトで便利:


ファイル内のSTDERRのみを取得します。非表示にするプログラムがまったく存在しない場合でも(親スクリプトをハングさせません)、STDOUT を非表示にすると、これだけで機能しました。

stty -echo && ./programMightNotExist 2> errors.log && stty echo

完全に切り離してすべてを沈黙させ、親スクリプトを殺しても中止されません./prog

 ./prog </dev/null >/dev/null 2>&1 &

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