web-dev-qa-db-ja.com

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

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

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

15
AJJ

&2>&1は、単に1がファイル名ではなくファイル記述子であることを示しています。この場合、standard output file descriptor

2>1を使用すると、エラーは1というファイルにリダイレクトされますが、2>&1を使用すると、エラーはstandard 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であるため、端末に表示され、パイプまたは再リダイレクトできますが、ファイルには書き込まれません。

23
George Udosen

> FILE 2>&1&> FILEは同等です。 8.2.3.2。エラーのリダイレクト of in Bash Guide for Beginners Chapter 8 を参照してください

4
J. Starnes

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

Ubuntuを含むシステムのような* nixでは、すべてがファイルである、またはむしろ ファイル記述子 であるとよく耳にします。標準出力は定数ファイル記述子1で、標準エラーはファイル記述子2です。したがって、> FILE 2>&1は技術的にはファイル記述子2をファイル記述子1に複製することを意味します。つまり、 この答え

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

ここで重要なのは、最初に記述子1を設定する必要があることに注意することです。シェルはリダイレクトを左から右の順序で処理するため、command >FILE 2>&1は、commandのstdoutを最初にFILEに再配線するようシェルに指示し、その後で記述子2が1のコピー、つまり1と2ポイントが同じ場所-FILEになります。

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

...(dup2)filedescritor 2をfiledescriptor 3に複製します。filedescriptor3が既に開いている場合は閉じます。

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

&>bashに固有であることも注目に値します。 zsh でこれは同じように動作しますが、ドキュメントによると、「...マルチスが存在する場合、「> Word 2>&1」と同じ効果はありません」。 POSIX準拠の/bin/shでは、これはコマンドをバックグラウンドに配置する通常のリダイレクトとして扱われます。 構文的に有効なbashコードではないshコードはありますか? も参照してください。

こちらもご覧ください:

1