stdoutに出力するプログラムがあり、ファイルにパイプしている間、その出力をBashスクリプトで黙らせたいと思っています。
たとえば、プログラムを実行すると次のように出力されます。
% myprogram
% WELCOME TO MY PROGRAM
% Done.
次のスクリプトが端末に何も出力しないようにしたいのですが。
#!/bin/bash
myprogram > sample.s
stdoutに出力するプログラムがあり、ファイルにパイプしている間、その出力をBashスクリプトで黙らせたいと思っています。
たとえば、プログラムを実行すると次のように出力されます。
% myprogram
% WELCOME TO MY PROGRAM
% Done.
次のスクリプトが端末に何も出力しないようにしたいのですが。
#!/bin/bash
myprogram > sample.s
回答:
それが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
&>
bashの4より多くの古い
&>
の紹介をリンクできますか?:o
>>&
、4.0で導入されたことを示しています。言及はありません&>
が、変更点は2.0に戻るだけなので、それはすでに1.xにあったことを意味します。
git blame
上のredir.c
1998点現在のコードベースに依然として最も古い発生をコミット。
これにより、stderr(記述子2)がstdoutであるファイル記述子1にリダイレクトされます。
2>&1
これを実行すると、標準出力をファイルにリダイレクトします sample.s
myprogram > sample.s
2つのコマンドを組み合わせると、stderrとstdoutの両方がsample.sにリダイレクトされます。
myprogram > sample.s 2>&1
/dev/null
アプリケーションを完全にサイレントにする場合は、にリダイレクトします。
myprogram >/dev/null 2>&1
myprogram >/dev/null 2>&1
(前のウェッジ/dev/null
とリダイレクトの順序に注意してください)。
myprogram &>/dev/null
十分ではないでしょうか?
すべての出力:
scriptname &>/dev/null
ポータブル:
scriptname >/dev/null 2>&1
ポータブル:
scriptname >/dev/null 2>/dev/null
新しいbashの場合(移植不可):
scriptname &>-
-
、これ&>
は移植できないbourneシェル拡張です。
echo moo 1>&-
ファイルディスクリプタ1が閉じているため、エラーを生成します:-bash: echo: write error: Bad file descriptor
STDOUTとSTDERRの両方[すべて]が必要な場合、最も簡単な方法は次のとおりです。
#!/bin/bash
myprogram >& sample.s
次にのよう./script
に実行すると、端末に出力が得られません。:)
">&"はSTDERRおよびSTDOUTを意味します。&
:また、パイプと同じように動作します./script |& sed
SEDにすべてを送信します
a 2>&1 | b 2>&1 | c
それでも答えを見つけるのに苦労している場合、特に出力用のファイルを作成した場合で、明確な代替手段が必要な場合:
echo "hi" | grep "use this hack to hide the oputut :) "