web-dev-qa-db-ja.com

2>&-、2> / dev / null、|&、&> / dev / nullと> / dev / null 2>&1の違い

違いを探すだけ

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

tcshmkshなどのnon-Bourne shellsとの移植性.

208
Det

背景:

  • a number 1 = standard out (i.e. STDOUT)
  • a number 2 = standard error (i.e. STDERR)
  • 数値が明示的に指定されていない場合、number 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 man page を参照してください。

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

256
slm

これは、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シェルの標準のリダイレクト方法です。

12
BriGuy

これは、選択した回答の補遺と考えてください。どの形式が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を使用することもできます)。

4
Craig Hicks