シェルでよく使われるファイルディスクリプタの標準出力、標準エラー出力ってなに?

shell

シェルのファイルディスクリプタってなんですか?

標準入出力を機械が区別するために用意されている数字だよ!

うーん。標準入出力を機械が区別するってどういうこと?

OK!順を追って説明するね。

標準出力と標準エラー出力

こんなシェルコマンドを用意してみたよ。

echo "おはよう"

echoはシェルでよく使われるコマンドなんだけど、意味は「引数(今回は”おはよう”)を出力する」だよ!


試しに実行してみるね。

echo "おはよう"
おはよう

この場合、標準出力に「おはよう」が表示されたということなんだ。


今度はこんなコマンドを用意してみたよ。

ech "おはよう"
ech: command not found

コマンドが「echo」ではなく「ech」となっていたから、コマンドが間違っているよって言われちゃったけど、この時に表示されているのは、標準エラー出力なんだ。

実は冒頭で話した数字というのは下の表のように割り当てられているんだ。

ファイルディスクリプタの数字割り当て

1:標準出力
2:標準エラー出力

でもなんでわざわざ数字で割り当てる必要があるの?

それはね、シェルのコマンドで標準出力、標準エラー出力を操作するためなんだ!

ファイルディスクリプタを用いたコマンド例

標準出力を使ったコマンドを例に説明するね。

echo "おはよう" $1 > file.txt

ざっと下に説明を書いておくね。

各引数の説明

$1 → さっきの「1」の前に「$」をつけて標準出力を指定
>  (今回の場合は)標準出力をテキストファイルにリダイレクト
file.txt → テキストファイル

「>」のリダイレクトってどういう意味か教えてください。

リダイレクトというのはね、
あるモノへの向け先をほかのモノへ変えるという意味なんだ。
「>」は見てわかるように左から右へリダイレクトしているということだから
“おはよう”という標準出力($1)を「file.txt」ファイルにリダイレクトしているということになるよ。
試しに実行してみるね。

echo "おはよう" $1 > file.txt

あれ?何も表示されないよ…

これで想定通りだよ。
さっき説明した、標準出力、標準エラー出力はその内容に関係なく表示されてたけど、リダイレクトということは向け先を変えるということだよね。
つまり“おはよう”という文字の向け先は、標準出力ではなく、標準出力に値は何もない状態だから、おはようは表示されなかったんだよ。
ちなみにリダイレクト先のファイルには”おはよう”と書き込まれるけど、書き込まれるだけだから表示はされないよ。

最後にファイルに書かれている内容を表示してみるね。

cat file.txt

catはファイルの内容を標準出力に表示するコマンドだよ。


実行すると…

cat file.txt
おはよう

さっきファイルにリダイレクトした”おはよう”が出力されたね。

まとめ

ということでまとめると、

・シェルのファイルディスクリプタは標準入出力を機械が区別するために用意されている数字のこと
・0は標準出力、1は標準出力エラーで、シェルコマンドで使用するために数字が割り当てられている。
・ファイルディスクリプタは数字の前に$マークを付けるとコマンドで使用できる
・「>」はリダイレクトを意味していて、あるモノへの向け先をほかのモノへ変える処理を行う。

先生!大変よくわかりました!
ありがとうございます!

コメント

タイトルとURLをコピーしました