これまで
シェルもどき「oreshell」を自作している。
現状のoreshellはリダイレクションを行うとエラーになるのでリダイレクションできるように修正する。
oreshellのリダイレクション対応にあたってリダイレクションについていろいろぐぐって調べてみると、自分の知らないリダイレクション機能がいくつかあった。
posixで定義しているシェルのリダイレクションの種類を以下に示す。(参考)
以下、commandはコマンド名、nはコマンドのファイルディスクリプタ番号を表す。
ファイルの内容をコマンドの入力用ファイルディスクリプタnへリダイレクト。nを省略した場合は0(標準入力)を指定したとみなす。
コマンドの出力用ファイルディスクリプタnからファイルへリダイレクト。nを省略した場合は1(標準出力)を指定したとみなす。
コマンドの出力用ファイルディスクリプタnからファイルへ上書き禁止状態であってもリダイレクト。nを省略した場合は1(標準出力)を指定したとみなす。
上書き禁止ってなんだ?とぐぐってみると、posixシェルは「set -C」でリダイレクションによるファイルの上書きを禁止できるらしい。(参考)
例:
なお、「set +C」で元の状態(上書き許可)に戻る。
コマンドの出力用ファイルディスクリプタnからファイルへ追記書き込みでリダイレクト。nを省略した場合は1(標準出力)を指定したとみなす。
指定した終端文字列までの入力(開業も含む)をコマンドの入力用ファイルディスクリプタnへリダイレクト。nを省略した場合は0(標準入力)を指定したとみなす。
使用例:
リダイレクションでヒアドキュメントができるとは知らなかった。
「<<-」で先頭のタブ文字を無視してくれるらしい。シェルスクリプトで使うと便利だそうな。コマンドラインからやろうとすると特殊な入力が必要となる。(参考1 参考2)
コマンドの入力用ファイルディスクリプタnをファイルディスクリプタmとして複製する。nを省略した場合は0(標準入力)を指定したとみなす。
コマンドの出力用ファイルディスクリプタnをファイルディスクリプタmとして複製する。nを省略した場合は1(標準出力)を指定したとみなす。
ファイルディスクリプタの複製というより、ファイルディスクリプタの接続先をつなげ直すと考えるほうが正しいような気がする。
出力の複製は
でよく見かける。
順番を間違えると期待通り動作しない。(参考)
入力の複製はどんな時に使うのだろう?
「<&-」「>&-」とするとファイルディスクリプタを閉じるらしいが使い方が良くわからない。。。
シェルスクリプトを書くときに使うのだろうか?(参考)
コマンドのファイルディスクリプタnを読み書き両方用に開く。nを省略した場合は0(標準入力)を指定したとみなす。
これも使い方が良くわからない。。。
シェルスクリプトを書くときに使うのだろうか?(参考)
例
試してみる。
oreshellで上記すべてを対応することを考えると気が遠くなるので、とりあえずリダイレクションの種類は以下の2つだけを対応する。
また、
リダイレクションを複数指定できるようにする。
が、
リダイレクション指定の位置はコマンドの後方のみとする。
上記以外は現時点では対応しない。