2>&-, 2>/dev/null, |&, &>/dev/null および >/dev/null 2>&1 の違い

2>&-, 2>/dev/null, |&, &>/dev/null および >/dev/null 2>&1 の違い

ただ違いを探してみると

  • 2>&-
  • 2>/dev/null
  • |&
  • &>/dev/null
  • >/dev/null 2>&1

tcshBourneシェルではなくシェルへmkshの移植性。

答え1

背景:

  • 番号1=標準出力(例:STDOUT)
  • 2回=標準エラー(例:STDERR)
  • 数値を明示的に指定しない場合番号1シェルによって仮定される

まず、その機能を見てみましょう。参考までに以下を参照してください。高度なバッシュスクリプトガイド

機能

2>&-

これの一般的な形態はですM>&-「中」ファイル記述子です。これにより、参照されたファイル記述子の出力が閉じます。「中」

2>/dev/null

これの一般的な形態はですM>/dev/null「中」ファイル記述子です。これにより、ファイル記述子がリダイレクトされます。「中」、到着する/dev/null

2>&1

これの一般的な形態はですM>&N「中」&「N」ファイル記述子番号。ファイル記述子の出力を結合します。「中」そして「N」単一ストリームとして。

|&

これは単なる略語です2>&1 |。 Bash 4に追加されました。

&>/dev/null

これは単なる略語です>/dev/null 2>&1。ファイル記述子2(STDERR)と記述子1(STDOUT)にリダイレクトします/dev/null

>/dev/null

これは単なる略語です1>/dev/null。ファイル記述子1(STDOUT)を/dev/null

bash以外の場所、tcsh、mkshなどに移植可能

csh私は外部の他のシェルをあまり扱っていませんでしたtcsh。 Bashのリダイレクト演算子と比較して、この2つの操作の私の経験によると、bashはこの点で優れています。よりtcsh のマニュアルページ詳細については。

csh / tcshはあなたが要求したコマンドを直接サポートしません。同様の関数を構成するには、別の構文を使用する必要があります。

答え2

これはSTDERRとSTDOUTをリダイレクトすることです。

  • 2>/dev/null

    STDERRを/ dev / nullにリダイレクトする(コンソールには表示されません)

  • |&

    STDERRとSTDOUTをパイプコマンド(cmd1 |&cmd2)のSTDINにリダイレクトします。

  • &>/dev/null

    STDERRとSTDOUTを/ dev / nullにリダイレクトします(コンソールには何も表示されません)。

  • >/dev/null

    STDOUTを/ dev / nullにリダイレクトする(コンソールにはSTDERRのみが表示されます)

  • 2>&-

    リダイレクトで使用されるファイル記述子を閉じるために使用されます。

これは Bourne シェルの標準的なリダイレクト方法です。

答え3

選択した回答の付録を検討してください。どの形式がPOSIXで、どの形式ではないのか疑問に思うでしょう。

2 つの POSIX 形式が関連しています。

2.7.2 出力リダイレクト

リダイレクトされた出力の2つの一般的な形式は次のとおりです。

[n]>単語

[n]>|単語

オプション n はファイル記述子番号を表します。この数値を省略すると、リダイレクトは標準出力(ファイル記述子1)を参照する必要があります。

noclobberオプションが設定されていて(set -Cの説明を参照)、単語拡張子と呼ばれるファイルが存在し、通常のファイルの場合、「>」形式を使用した出力リダイレクトは失敗します。そうでない場合は「>」または「>|」リダイレクト形式を使用すると、単語拡張のために名前付きファイルが生成され、指定されたファイル記述子から出力されるか、指定されていない場合は標準出力として開きます。ファイルが存在しない場合はファイルが作成され、それ以外の場合は開くと空のファイルに切り捨てられます。

-

2.7.6 出力ファイル記述子のコピー

リダイレクト演算子:

[n]>単語(&W)

出力ファイル記述子は他の出力ファイル記述子からコピーするか、出力ファイル記述子を閉じる必要があります。単語が1つ以上の数値として評価されると、nまたは標準出力(nが指定されていない場合)で表されるファイルディスクリプタは、単語の数字がForを使用して開かれたファイルを表していない場合、単語として表示されるファイルディスクリプタのコピーになります。出力ファイル記述子でリダイレクトエラーが発生します。シェルエラーの結果を参照してください。単語が「-」と評価されると、ファイル記述子nまたは標準出力(nが指定されていない場合)が閉じます。開いていないファイル記述子を閉じようとすることは、エラーと見なすべきではありません。単語が異なると評価された場合、アクションは指定されません。

だから:

Function      POSIX-compat    POSIX 
2>&-          Yes             close 
2>/dev/null   Yes             redir
2>&1          Yes             dup 
|&            No              
&>/dev/null   No
>/dev/null    Yes             redir
>&/dev/null   ?               ?dup

最後の行は元の質問にはありませんが、bashでは苦情なく動作します。 (/dev/nullの代わりに/dev/ttyを使用することもできます)。

関連情報