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


61

私は両方をリダイレクトする方法のすべての種類試してみました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つの出力のみで、両方を同時にリダイレクトすることはできません。

回答:


102

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

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

stderrに複製する前に、まず stdoutリダイレクトする必要があります。最初に複製すると、stderrはstdoutが元々指していたものを指すだけです。

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

ls good bad &>/dev/null

これはコマンドラインでは便利ですが、移植性を目的としたスクリプトでは避ける必要があります。


1
実際、ボーンシェルのマニュアルを読みました。それはそれ以降のバージョンのことを述べて/bin/sh実装されている&>/dev/null構文は、aparentlyないか、私は(私は十分なものでなければならないので、カントーのOpenBSD 5.3を実行し、どのような方法でエコーすることはできません)古いバージョン持っている
Torxed

8
@ Torxed、OpenBSD shはpdkshに基づいています。最近ではBourneシェルはありません。cshで紹介され>&ていますzshbash選択した&>(今もでサポートされているzshと、いくつかpdkshあるため、それは明らかにPOSIX準拠を破るのに誘導体)がfoo &> file完全に異なる何かを意味完全に有効なPOSIXの構文は次のとおりです。
ステファンシャゼラス

3
@StéphaneChazelas (...)これは完全に異なるものを意味しますこの場合、それが何を意味するのか疑問に思いました... :)
ピョートルドブロゴスト14

4
@PiotrDobrogost foo &> fileは、foo & > fileまたはのようなものfoo & : > fileで、バックグラウンドでfooを実行し、コマンドなしで書き込み用にファイルを開きます(そのように使用される可能性は低い)。
ステファンシャゼル14

5
@PiotrDobrogost >&>&2>&-演算子と競合するため、理想的でもありません。zshcshユーザーの便宜のために追加しました(cshにはありません>&2)。それらは単なる構文糖であり、> file 2>&1標準で移植可能な(Bourneのようなシェルに)使用するだけです。
ステファンシャゼル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.