command 1> out
または2>&1
のようなものがstderrをリダイレクトするように見えますが、時には&>
自体も表示されます。
&
を理解する最良の方法は何ですか?
&
の2>&1
は、単に1
がファイル名ではなくファイル記述子であることを示しています。この場合、standard output file descriptor
。
2>1
を使用すると、エラーは1
というファイルにリダイレクトされますが、2>&1
を使用すると、エラーはstandard output stream
に送信されます。
この&>
は、standard output
とstandard error
の両方をどこかに送信すると言います。たとえば、ls <non-existent_file> &> out.file
。例でこれを説明しましょう。
セットアップ:
次の内容のファイルkoko
を作成します。
#!bin/bash
ls j1
echo "koko2"
実行可能にする:chmod u+x koko
j1
が存在しないことに注意してください
./koko &> output
を実行します
cat output
を実行すると表示されます
ls: cannot access 'j1': No such file or directory
koko2
standard error
(ls: cannot access 'j1': No such file or directory
)とstandard output
(koko2
)の両方がファイルoutput
に送信されました。
もう一度実行しますが、今回は次のようになります。
./koko > output
cat output
を実行すると、koko2
のようなもののみが表示されます。ただし、ls j1
コマンドからのエラー出力ではありません。端末に表示されるstandard error
に送信されます。
@Byte Commanderに感謝します:
command >file 2>&1
では、リダイレクトの順序が重要であることに注意してください。代わりにcommand 2>&1 >file
と書くと(通常これは望んでいないことです)、最初にコマンドのstdout
をファイルにリダイレクトし、その後、コマンドのstderr
を現在使用されていないstdout
であるため、端末に表示され、パイプまたは再リダイレクトできますが、ファイルには書き込まれません。
> FILE 2>&1
と&> FILE
は同等です。 8.2.3.2。エラーのリダイレクト of in Bash Guide for Beginners Chapter 8 を参照してください
[n]>&Word
はDuplicating Output File Descriptorと呼ばれます(POSIX Shell Language Standardの セクション2.7.6 を参照)。この特定の動作は、ksh
、dash
、bash
などの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コードはありますか? も参照してください。
こちらもご覧ください: