違いを探すだけ
2>&-
2>/dev/null
|&
&>/dev/null
>/dev/null 2>&1
tcsh
、mksh
などのnon-Bourne shells
との移植性.
背景:
まず、これらの機能に取り組みましょう。参考として、 高度な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
にリダイレクトします。
csh
とtcsh
以外のシェルについてはあまり扱っていません。 bashのリダイレクションオペレーターと比較したこれら2つに関する私の経験は、bashはその点で優れているということです。詳細は tcsh man page を参照してください。
あなたが尋ねたコマンドのうち、どれもcsh/tcshで直接サポートされていません。同様の関数を作成するには、異なる構文を使用する必要があります。
これは、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シェルの標準のリダイレクト方法です。
これは、選択した回答の補遺と考えてください。どの形式が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を使用することもできます)。