出力リダイレクトの正確な意味と意味


19

stderrをリダイレクトcommand 1> outする2>&1ために、またはwithのようなものが表示&>されますが、時々それ自体も表示されます。

理解する最良の方法は何&ですか?

回答:


26

&中には、2>&1単に数がと言っている1ファイル記述子ではなくファイル名です。この場合、standard output file descriptor

を使用する2>1場合、これはエラーをというファイルにリダイレクトします1が、使用する場合2>&1standard output stream

これは&>、両方を送って、と言うstandard outputstandard error、どこか。たとえば、ls <non-existent_file> &> out.file。例でこれを説明しましょう。

セットアップ:

  1. koko次の内容のファイルを作成します。

    #!bin/bash
    
    ls j1
    echo "koko2"
    
  2. 実行可能にする: chmod u+x koko

  3. j1存在しないことに注意してください

  4. 今すぐ実行 ./koko &> output

  5. 実行cat outputすると表示されます

    ls: cannot access 'j1': No such file or directory
    koko2
    

standard errorls: cannot access 'j1': No such file or directory)とstandard outputkoko2)の両方がファイルに送信されましたoutput

もう一度実行しますが、今回は次のようになります。

./koko > output

cat output、あなただけのkoko2ように表示されます。ただし、ls j1コマンドからのエラー出力ではありません。これはstandard error、端末に表示される場所に送信されます。

@Byte Commanderに感謝します:

command >file 2>&1リダイレクトの順序が重要であることに注意してください。command 2>&1 >file代わりに書く場合(通常はあなたが望むものではありません)、最初にコマンドstdoutをファイルにリダイレクトし、その後コマンドstderrを現在未使用stdoutにリダイレクトしますので、端末に表示され、パイプまたはリダイレクトすることができます繰り返しますが、ファイルには書き込まれません。


2
どういう&>意味ですか?
AJJ

1
command >file 2>&1リダイレクトの順序が重要であることに注意してください。command 2>&1 >file代わりに書く場合(通常はあなたが望むものではありません)、最初にコマンドのstdoutをファイルにリダイレクトし、その後コマンドのstderrを現在使用されていないstdoutにリダイレクトしますので、端末に表示され、パイプすることができますまたは再度リダイレクトしますが、ファイルには書き込まれません。
バイトコマンダー

2
「それはstandard outputあなたの端末に表示される場所に送信されます。」これは「に」ではないstandard errorですか?
frarugi87

1
はい@ frarugi87あなたの権利が修正されました
ジョージウドセン

1
すごい@George、あなたは速かった;)良い仕事
frarugi87


1

これ[n]>&wordは、出力ファイル記述子の複製と呼ばれます(POSIX Shell Language Standardのセクション2.7.6を参照)。この特定の動作には、ボーンのようなシェルの機能でありkshdashbash。実際、標準はBourneシェルとに基づいていkshます。tcshcshのマニュアルを見ると、明らかにファイル記述子を複製する機能は提供されていませんが、の説明から>&、これは次のように動作&>しますbash(つまり、エラーと通常の出力をファイルにリダイレクトします)。

Ubuntuを含む* nixのようなシステムでは、すべてがファイル、またはファイル記述子であるとよく耳にします。標準出力が一定のファイルディスクリプタ1と標準誤差は、ファイル記述子である2だから、> FILE 2>&1技術的に他の言葉ではファイルディスクリプタ1上に重複するファイルディスクリプタ2を意味し、この答えは

2>&1は、シェルに、記述子1の複製であるファイル記述子2をコマンドに与えるように指示します(つまり、stderrとstdoutは同じfdを指します)。

ここで重要なのは、最初に記述子1を設定する必要があることに注意することです。左から右の順にシェルプロセスのリダイレクトので、command >FILE 2>&1用のReWire stdoutにシェルを伝えcommandに行くFILE最初の、そして唯一の後、記述子2は、同じ場所に1と2点である1のコピー、になることができます- FILE

もちろん、これは標準エラーと標準出力を超えています。この答えに示されているように、3&>2

...ファイル記述子3に(dup2)ファイル記述子2を複製します。ファイル記述子3が既に開いている場合は閉じます。

多くの場合、ファイル記述子を操作する例はコマンドの出力を変数にキャプチャすることですdialog

また、&>に固有であることに注意してくださいbash。ではzshこの、同じ動作をしますが、ドキュメントによると、「... MULTIOSの存在下で『>単語2>&1』と同じ効果を持っていません」。POSIX準拠では/bin/sh、これはコマンドをバックグラウンドに置く通常のリダイレクトとして扱われます。また、構文的に有効なbashコードではないshコードはありますか?

こちらもご覧ください:

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