# リダイレクションってなに? - シェルもどきをgoで自作する #5 ## おさらい これまで - [シェルってなに?コマンドラインインタプリタってなに? - シェルもどきをgoで自作する#1](https://hackmd.io/@jyami/HJzohRn2D) - [コマンドと引数の分解、環境変数PATHから探索、外部コマンドと内部コマンド - シェルもどきをgoで自作する #2](https://hackmd.io/@jyami/HyeSkkThP) - [字句解析その1 - シェルもどきをgoで自作する #3](https://hackmd.io/@jyami/Hk3bWSMQO) - [字句解析その2 - シェルもどきをgoで自作する #4](https://hackmd.io/@jyami/S1BkltxQu) シェルもどき「[oreshell](https://github.com/jyami/oreshell)」を自作している。 空白文字を含んでいるファイル名/パス名(例:「cp \ oge "h ge"」)を扱えるようなった。 ## 現状のoreshellはリダイレクションでエラーになる 空白文字を含んでいるファイル名/パス名を扱えるようになったが、他にもまだまだエラーが発生する。 ``` $ cat hoge.txt hoge $ cat hage.txt hage $ cat hoge.txt - < hage.txt > result.txt hoge cat: -: Bad file descriptor cat: '<': No such file or directory hage cat: '>': No such file or directory cat: result.txt: No such file or directory cat: closing standard input: Bad file descriptor ``` リダイレクションに対応していないためエラーになる。 (catでわざわざ「-」を使っているのは標準入力の例を示すため。) ## リダイレクションとは [wikipediaより](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88_(CLI)) > リダイレクションとは、様々なシェルを含むほとんどのコマンドラインインタプリタに共通の機能であり、標準ストリームをユーザで指定した位置に変更する機能のこと。 通常、(posixの)一般的なプロセスは標準入出力を持つ。 プロセス生成時に - 標準入力はキーボード - 標準出力は画面 - 標準エラー出力は画面 に結び付けられている。 ![](https://i.imgur.com/2teSB2I.png) この結びつきを、リダイレクションによってその入力元や出力先をファイルなどに切り替えることができる。 ![](https://i.imgur.com/Z1EfUlZ.png) リダイレクションの指定には「>」「<」などを使う。 ### リダイレクションの例 ■ 例「cat hoge.txt - < hage.txt > result.txt」 ![](https://i.imgur.com/sSwqShN.png) ## なぜ現状のoreshellではエラーになるのか、どのように修正するのか 現状のoreshellでは「-」「< hage.txt」「> hoge.txt」のすべての文字列をプロセス生成時にcatコマンドの引数としてOSカーネルに渡している。 リダイレクションはシェルで実現する機能である。OSカーネルに「>」や「<」の文字列を渡してもOSカーネル(が生成したcatプロセス)はこれらの文字列を理解できない(その名前のファイルを探そうとする)ためエラーになる。 ■現状 ![](https://i.imgur.com/vgUe4fk.png) 「< hage.txt」や「> hoge.txt」の文字列はOSカーネルに渡す前に切り取る必要がある。 また、プロセス生成時に標準入力元/標準出力先/標準エラー出力先を「hage.txt」「hoge.txt」に切り替える機能が必要がある。 ■修正予定 ![](https://i.imgur.com/3Ke2oDe.png)