回答:
背景:
まず、これらの機能に取り組みましょう。参照については、高度な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のマニュアルページを参照してください。
どれについても尋ねなかったコマンドのうち、csh / tcshは直接サポートしています。同様の関数を作成するには、異なる構文を使用する必要があります。
2>&-
vs と同じようなものはありません2>/dev/null
(いくつかの「粗末な」書かれたプログラムが2>&-
正しく理解できないことを除いて)?
&>
はbash
最初から入っていました(BourneとPOSIXの互換性を壊しますが、それはそこでは何か違うことを意味しますが、ヒットする可能性は低いです)。>&
から|&
来ます(t)csh
(そしてそれがstderrをリダイレクトする唯一の方法です)。それらはzsh
最初から入っていて、最近のみに追加されたbash
。rc
より適切に設計された演算子についても参照してください。
(+2-2=0)
。さて、編集部分については、あまり編集しませんが、この場合は、操作後のデータがになることを明確にしているため、編集しN
ます。私はあなたが答えを読んだことを読みました、そしてそれはすべての面で非常に素晴らしいです。この小さなあいまいさだけで私は考え始めました。それがエディションの理由です。ただし、必要に応じて、自由に追加または拒否してください。ポイントを説明できるといいのですが。良い仕事を続けてください。
これは、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シェルの標準的なリダイレクト方法です。
|&
ポータブルで&>/dev/null
はありません。
これを選択した回答の補遺と考えてください。どのフォームが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でも動作します)。
&>
GNU bashの互換性をサポートしていますが、解析することで既存のPOSIXスクリプトのセマンティクスを壊す可能性があるため、これを使用しないことを強くお勧めします。