シェルスクリプトのファイルディスクリプタ

イントロ

シェルでこんなコマンドを見ることがある。null 2>&1

これが何をやっているのか、初めてだとわかりにくいかもしれませんので、このノートで簡単に説明します。

I/O Redirection

今、簡単なテキストファイルがあるとします:

Aを実行します。シンプルなテキストファイルです。

ここで、このファイルの内容を別の場所にリダイレクトします:

ファイルの内容をリダイレクトする

上記のリダイレクト動作では、ターミナルに何も表示されませんが、これは>コマンドが test.txt の中身をoutput.txtは、標準出力(stdout)です。

標準出力とは対照的に、標準エラー(stdr)がある、例えば

An error occurred during6082>リダイレクト処理中にエラーが発生しました。

現在のディレクトリに no_such_file.txt という名前のファイルが存在しないため、リダイレクト処理中にエラーが発生しました。 この場合、>コマンドを使用しても、stdoutがなく、代わりにstderrorのエラーメッセージが表示されるため、output.txtに内容を入力することはできない。

File Descriptor

ファイル記述子は、開いているファイルに対する正の整数と考えることができる。

Unix/Unix 系システムでは、stdout と stderr 専用のファイルディスクリプタもあり、はっきり言って、これらの出力のための専用の行き先を持っているのです。for these output destinations:

  • 1: for stdout
  • 2: for stderr

Putting all together

以上の考え方により、もし既知のファイルの内容を別のファイルに書きたい場合、以下のようになります。

ファイルの内容を別の場所にリダイレクトする viastdout.

こちら側の1がstdoutを表し、その構文は次のように表される:

  • >

つまり、誰かが from.foo > to.bar と書いたとき、それは

同様に、標準エラーコードをリダイレクトするには次のようにします:

エラーメッセージを stderr で別の場所にリダイレクトする

stdout と stderr の両方を同じ宛先にリダイレクトしたい場合は、次のようにしてください。

stderrをstdoutと同じ場所にリダイレクトする。
  • &1 はファイルディスクリプタIDが1、つまりstdoutへの参照として使われます。
  • 2>&1 はstderrの内容をstdoutへリダイレクトすることを意味しています。2867>Summary
    • 通常、出力の宛先は stdout と stderr の 2 つです。
    • 出力を別の場所に向けることができますが、通常はファイルに向けることになります。
    • ファイルディスクリプタでstdout(1)とstderr(2)を区別できるようにしました。
    • コマンド > output_location は、実際にはコマンド 1> output_location の省略形です。
    • 他のファイルディスクリプタを参照するために&を使うことができる。
  • コメントを残す

    メールアドレスが公開されることはありません。