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


192

の違いを探しているだけ

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

その可搬性non-Bourne shellsのようなtcshmkshなど


2
mkshは&>GNU bashの互換性をサポートしていますが、解析することで既存のPOSIXスクリプトのセマンティクスを壊す可能性があるため、これを使用しないことを強くお勧めします。
ミラビロス14

^ /dev/nullはそれが何をするのかを見てきましたか?
balupton

回答:


241

背景:

  • 数1 =標準出力(すなわちSTDOUT)
  • 数2 =標準誤差(すなわち、STDERR)
  • 数値が明示的に指定されていない場合、シェルは数値1を想定します(bash)

まず、これらの機能に取り組みましょう。参照については、高度なBashスクリプトガイドを参照してください。

機能

2>&-

この形式の一般的な形式はM>&-「M」はファイル記述子番号です。これにより、参照されているファイル記述子、つまり"M"の出力が閉じられます。

2>/dev/null

この形式の一般的な形式はM>/dev/null「M」はファイル記述子番号です。これは、ファイルディスクリプタ、リダイレクトします「M」をし、/dev/null

2>&1

この形式の一般的な形式はM>&N「M」「N」がファイル記述子番号です。ファイル記述子「M」「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などへの移植性

私の外に他のシェルとあまり扱っていませんでしたcshtcsh。bashのリダイレクト演算子と比較したこれら2の私の経験では、bashはその点で優れています。詳細については、tcshのマニュアルページ参照してください。

どれについても尋ねなかったコマンドのうち、csh / tcshは直接サポートしています。同様の関数を作成するには、異なる構文を使用する必要があります。


勝者がいます。しかし、パフォーマンスの違いはありませんか、2>&-vs と同じようなものはありません2>/dev/null(いくつかの「粗末な」書かれたプログラムが2>&-正しく理解できないことを除いて)?
デット

3
パフォーマンスの違いはありません。
slm

5
&>bash最初から入っていました(BourneとPOSIXの互換性を壊しますが、それはそこでは何か違うことを意味しますが、ヒットする可能性は低いです)。>&から|&来ます(t)csh(そしてそれがstderrをリダイレクトする唯一の方法です)。それらはzsh最初から入っていて、最近のみに追加されたbashrcより適切に設計された演算子についても参照してください。
ステファンシャゼル14年

1
更新:パフォーマンスの問題について、それはまた、ここで確認しています:unix.stackexchange.com/questions/163955/...
デット

1
こんにちは@slm、連絡ありがとう。レポが変わらなかったことを嬉しく思います(+2-2=0)。さて、編集部分については、あまり編集しませんが、この場合は、操作後のデータがになることを明確にしているため、編集しNます。私はあなたが答えを読んだことを読みました、そしてそれはすべての面で非常に素晴らしいです。この小さなあいまいさだけで私は考え始めました。それがエディションの理由です。ただし、必要に応じて、自由に追加または拒否してください。ポイントを説明できるといいのですが。良い仕事を続けてください。
ベコ博士

11

これは、STDERRおよびSTDOUTのリダイレクト用です。

  • 2>/dev/null

    STDERRを/ dev / nullにリダイレクトします(コンソールに表示されないようにします)

  • |&

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

  • &>/dev/null

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

  • >/dev/null

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

  • 2>&-

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

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


4
|&ポータブルで&>/dev/nullはありません
クリスダウン

4

これを選択した回答の補遺と考えてください。どのフォームがPOSIXで、どのフォームがPOSIXではないかを知りたい場合があります。

2つのPOSIXフォームが含まれます。

2.7.2出力のリダイレクト

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

[n]>単語

[n]> |単語

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

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

-

2.7.6出力ファイル記述子の複製

リダイレクト演算子:

[n]>&word

1つの出力ファイル記述子を別の出力記述子から複製するか、1つを閉じます。wordが1桁以上に評価される場合、nで示されるファイル記述子、またはnが指定されていない場合の標準出力は、wordで示されるファイル記述子のコピーになります。wordの数字が出力用にすでに開いているファイル記述子を表していない場合、リダイレクトエラーが発生します。シェルエラーの結果を参照してください。wordが「-」に評価される場合、ファイル記述子n、またはnが指定されていない場合は標準出力が閉じられます。開いていないファイル記述子を閉じようとしても、エラーにはなりません。wordが他の何かに評価される場合、動作は指定されていません。

したがって:

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でも動作します)。


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