web-dev-qa-db-ja.com

stderrとstdoutの両方を/ bin / shで/ dev / nullにリダイレクトします

stdoutstderrの両方を/dev/nullにリダイレクトするためにあらゆる方法を試しましたが、成功しませんでした。私はほぼ一生bashを実行していて、この問題を一度も経験したことがありませんが、BSDの場合は/bin/shのままです。

私が試したこと:

if ls ./python* 2> /dev/null; then
    echo found Python
fi

...うまくいく; Pythonが存在しない場合は、lsからのエラーメッセージがミュートされます。ただし、python.tgzが存在する場合は、次のような行が出力されます。

# ./test.sh
./python-2.7.3p1.tgz

私はもう試した:

if ls ./python* &> /dev/null; then
    echo found Python
fi

そして

if ls ./python* 2>1 > /dev/null; then
    echo found Python
fi

そして

if ls ./python* > /dev/null; then
    echo found Python
fi

実際には何も機能しません。同時に両方ではなく、1つの出力のみをリダイレクトできます。

65
Torxed

これは、Posix互換シェルで機能します。

ls good bad >/dev/null 2>&1

stdrに複製する前にstdoutfirstをリダイレクトする必要があります ;最初にそれを複製すると、stderrはstdoutが最初にポイントしたものをポイントするだけです。

Bash、zshおよび他のいくつかのシェルもショートカットを提供します

ls good bad &>/dev/null

これはコマンドラインでは便利ですが、移植を目的としたスクリプトでは避けてください。

110
rici