2017-02-04 5 views
2

このページ(http://tldp.org/LDP/abs/html/io-redirection.html)(終わりに向かって)説明のcommand.log LS 2 -yz>&1 >>なぜ、このコマンド:このコマンドのエラーは、指定されたファイルで終了しないのはなぜですか?

ls -yz 2>&1 >> command.log

command.logファイルに出力しないエラーを行います。

しかし、まだ私には明らかではありません。 2>&1stderrstdoutにリダイレクトしている場合は>>の結果をstdoutにしてcommand.logに追加しますか?

答えて

1

リダイレクトの場合は、ご注文ください。それは逆のやり方です。

ls -yz >>command.log 2>&1 

リダイレクトは「ファイル記述子をコピーする」ことによって動作します。 stderrを先にリダイレクトしようとすると(stdoutをリダイレクトする前に)、stderrはの現在ののstdoutに送信されます。これは端末です。後でstdoutをファイルにリダイレクトすると、stderrをもう一度リダイレクトすることはありません。

+2

私の答えが正しいものではないかのように、私は下垂体への説明を非常に感謝します。私はここで何かを学びます。 – Fred

+0

私はOPが注文が重要であることを知っていると思います。質問は「なぜ」重要です。 OPによってリンクされたページに2つの順序が並べて表示されているので、これはかなり明確です。 – janos

1

デフォルトでは、stdout & stderrの両方が端末に送信されます。あなたの質問のコマンドでは、2>&1はstderrをstdoutと同じ場所に送るようシェルに指示します。その時点でのstdoutは端末、stderrと同じ場所にまだあるので、これはノーオペレーションのようなものです。 >> command.logはそれ以降に解析され、stdoutのみをそのファイルに送信して終了します。 @Fredが正しく言うように、注文は重要です。これを行うには

短い方法は次のとおりです。すべての

ls -yz &>> command.log 
3

まず、>log1>logのために短い手であることに注意してください。 N>M構文は、ポインタの再割り当てに変換されます。 標準出力fd1へのポインタと、標準エラーfd2へのポインタを呼び出します。つまり:

  • fd2します

    • fd1stdout
    • fd2へのポインタであることは、あなたがcmd 2>&1 >logを実行すると、それはこのようなポインタが変化しstderr

    へのポインタでありますfd1が指している点を指します()。

  • あなたがcmd >log 2>&1を実行すると、それはこのようなポインタを変更し、ファイルにstdoutfd1ポイントにfd2ポイント、結果として
  • =>ファイルへ

fd1ポイントを作ります

  • make fd1ファイルを指す
  • fd2は何を指しているか結果としてファイル
  • =される点、>、fd1fd2両方点同じファイルへ

ポインタ再割り当ての順序に基づいて、結果が異なることになる、です。あるケースでは、両方のポインタが同じものを指しているか、または異なるものを指しているでしょう。

代わりのコマンド例cmdとしてls -yzを使用して、私はこれはyesが存在するファイルであり、そしてnonexistentがないファイルですls yes nonexistent、ある説明し、より適切な例を見つけます。この例では、stdoutstderrの両方に何かが印刷され、N>Mの順番で再生すると、それぞれがどこで終了したかをより明確に観察できます。 (ls -yzの場合、stderrがありますが、stdoutは空です)

+1

非常によく説明されています! – codeforester

関連する問題