第9章 リダイレクトのファイル記述子

ここまでの説明でリダイレクトはファイルやターミナルに出力ができるってことは分かりましたよね?

まあでもファイルやターミナルは別物なわけすんで、明らかに別物に対してリダイレクトするには、コンピューター的には裏で何か橋渡しされてないとおかしいです。

その橋渡しになるのがファイル記述子( file descriptor 、略して fd )です。

このファイル記述子は整数の番号が割り振られてます。

例えば標準入力や標準出力には以下のような数値が定義されてます。

0
標準入力のファイル記述子
1
標準出力のファイル記述子
2
標準エラーへのファイル記述子

このファイル記述子はリダイレクトに直接使うことが可能です。

このうちリダイレクトで使うのは通常は 1 と 2 です。

0 も標準入力を使いたい

ファイル記述子 1 については前の項目で軽く説明しましたね。

$ コマンド 1>ファイル名
$ コマンド 1>>ファイル名

実際のコマンドとリダイレクトに直すと以下のような感じになります。

$ echo "abc" 1> abc.txt
$ cat abc.txt 1> abc2.txt
$ cat abc.txt 1>> abc2.txt
$ cat abc2.txt
abc
abc

標準出力がリダイレクトで指定されたファイルに書き込まれていますね?

少し理解が面倒なのが標準エラーです。

標準エラーからファイルに書き込むには以下のような文法が使われます。

$ コマンド 2>ファイル名
$ コマンド 2>>ファイル名
$ コマンド &>ファイル名

文法は標準出力と同じですよね。

単にファイル記述子の値が 1 から 2 に変わっているだけです。

&> というリダイレクトは標準出力と標準エラーの両方を同時にファイルに書き込みます。

&>
標準出力と標準エラーをリダイレクト

それでどんなのが標準エラーなんですかね?

標準エラーの一番簡単な発生のさせ方は存在しないファイルにアクセスしようとする場合です。

例えば ls コマンドを使ってみましょう。

$ ls xxx > abc.txt
ls: 'xxx' にアクセスできません: そのようなファイルやディレクトリはありません

この場合、ファイル記述子が指定されてないのでデフォルトの標準出力のみがリダイレクトされます。

確認してみましょう。

$ cat abc.txt

デフォルトの標準出力からのリダイレクトでは標準エラーはリダイレクトされてないですね。

ではファイル記述子を 2 に変えてやってみましょう。

$ ls xxx 2> abc.txt
$ cat abc.txt
ls: 'xxx' にアクセスできません: そのようなファイルやディレクトリはありません

このように標準エラーはファイル記述子を 2 にすればリダイレクトができるようになります。

ちなみに標準出力と標準エラーの両方に対応できる &> も一応検証しておきましょう。

$ echo "abcde" &> abc.txt
$ cat abc.txt
abcde
$ ls xxx &> abc.txt
$ cat abc.txt
ls: 'xxx' にアクセスできません: そのようなファイルやディレクトリはありません

まあこのようにエラーも標準出力もリダイレクトしています。

ちなみにここまでの構文をまとめると以下のようになります。

$ コマンド 入力ファイル記述子>ファイル名

例外として &> がありますが、まあ覚えなきゃいけないほどの代物じゃないです。

Copyright 2018-2019, by Masaki Komatsu