FENIX fsh Manual


FENIX Ver0.2 Copyright (C) 1991-1998 S.Uchida
fsh Ver0.2 Copyright (C) 1991-1998 S.Uchida

fsh は、ユーザーがFENIXを手軽に扱うために用意されたシェルです。

UNIXライクなコマンド体系に加え、フルスクリーン編集可能というBASICの特徴も受け継いでいます。

入力の際、プロンプトは表示されません。 また、カーソル移動やコピーキーもBASICと同じように使うことができます。

以下、ややこしいことを書きますが、要するにコマンドをキーボードから打ち込めばそのコマンドが動くということです。

★★ fsh 文法 ★★

シェルは、入力された行をワード単位に分割し、各ワードを解釈します。 そして第1ワードをコマンドの名前と見なし、コマンドを実行します。 コマンドの名前は大文字小文字などを厳密に区別します。

コマンド名にパスが含まれていれば、無条件にファイルと見なしてファイルを探します。それ以外は、
内部コマンド→オブジェクト→ファイル
の順に検索します。 ファイルの起動は、
オブジェクトロード→実行→オブジェクト消去
の手順で行われます。したがって、オブジェクトに空きがなければ起動できません。

★ コマンド行の構造

シェルは基本的にスペースかタブをワード分割の単位として入力行を分割します。 しかし、以下の場合は例外となります。
"...."    2重引用符で囲まれた文字列は、スペースやタブを含んでいても1ワードと見なされます。 文字列内部のワイルドカードなどは解釈されます。
""....""    複数の2重引用符で始まる文字列は、同じ数の2重引用符が現れるまでの間1ワードと見なされます。 しかも文字列内部は一切解釈されません。
< , >    不等号は標準入出力のリダイレクトを表します。 リダイレクト構成文字は強制的に独立したワードになります。
|    パイプを構成します。強制的に独立ワードになります。
;    コマンドの単純な連結を示します。強制的に独立ワードになります。

★ コマンド行の解析

シェルにはメタキャラクタと呼ばれる特殊な意味を持つ文字があります。 これらを以下に示します。
"    2重引用符は独立ワードの区切りとなります。
* ?    この2文字はワイルドカードです。これらの文字を含むワードはファイル名と見なされ、展開されます。
\    この文字に続く1文字を普通文字と解釈します。メタキャラクタの意味を打ち消すのに使用します。
\{@〜_}    括弧内の文字を制御コードを表すものとして、chr$(0)〜chr$(31)に変換します。括弧自身はメタキャラクタではありません。
#    その行の#以降の文字を全て無視します。コメントに使えます。
$    変数のために予約されています。現在は通常キャラクタ扱いです。
これらを元にシェルはコマンド行を解釈します。

★ 標準入出力のリダイレクト

FENIX上のツールのいくつかのものは、標準入力から入力を受け取り 標準出力に出力します。

標準入力とは、通常キーボードにつながっている入力用デバイスです。 リダイレクトすることによって、ディスクなどに入力を切り換えることができます。

また標準出力とは、通常ディスプレイのテキスト画面につながっている 出力デバイスです。これもリダイレクトによって切り換えることができます。

次のメタキャラクタは標準入出力のリダイレクトを示します。 これらのワードの次のワードがリダイレクトのファイル名を表します。 リダイレクトファイルはBSD形式に限ります。

これらはシェルの内部で解釈され、コマンドには渡されません。

<    標準入力をリダイレクトします。
<<word    word の先頭文字を標準入力のEOF文字とします。 デフォルトでは ctrl-Q となっています。 これはキーボードからはGRAPHモードでないと入力できません。
> , >!    標準出力をリダイレクトします。 > は存在するファイルには書き込めません。 >! は存在すれば重ね書きされます。 しかし書き込み不可のファイルには書き込めません。
>>    上と同じですが、重ね書きせずに後ろに追加されます。

★ パイプ

| はパイプを構成します。 command1 | command2 のように使用します。

これは、command1 の標準出力を command2 の標準入力につなぐことを意味しています。 実際の動作は、内部で中間ファイルにリダイレクトしているだけです。

中間ファイルは、通常カレントドライブのルートディレクトリに生成されます。 従ってディスクがプロテクトされていたりするとエラーになります。 また、中間ファイルを生成するディレクトリは変数TEMPによって設定可能です。 詳しくはシステム変数の説明を参照して下さい。

★ マルチコマンド

; はコマンドを連結します。 command1 ; command2 のように使用します。

単にコマンドを続けて実行するというだけで、コマンド間に影響は及びません。

★ シェルスクリプト

テキストファイルにあらかじめ一連のコマンドを記録しておき、それを実行することができます。

実行できるのはtxtタイプのオブジェクトです。また、BSD形式のファイルはデフォルトでtxtタイプとしてロードされますので、BSDファイルを直接実行することもできます。

しかし単にtxtオブジェクトであれば実行できるわけではありません。 最初の文字が "#" (半角シャープ)でなければエラーになります。

★ 変数の設定・消去

変数を設定することができます。しかし、数値変数ではなく、BASICで言えば文字変数の配列のようなものです。

変数は0個以上のワードから構成されます。 設定は set で、消去は unset で行います。

変数名には任意の文字を任意の長さで用いることができます。 当然、英字の大文字、小文字も区別します。 しかし、半角英大文字だけで構成された名前は、後述するシステム変数として使用したいので、ユーザーは使わないようにして下さい。

★ システム変数

システム変数とは、厳密な定義ではありませんが不特定多数のアプリケーションで 使用される汎用的な変数です。 まず、シェルが使用しているものについて説明します。

その他、アプリケーション用に現在想定しているものを挙げます。 これらは予告なしに追加・変更されることがあります。

★ シェルの初期動作

fsh は起動すると、まずカレントディレクトリに .fshrc というファイルがあるかどうかを調べ、もしあればそれを実行します。 .fshrc はシェル自身の設定を行うためのシェルスクリプトです。

そして、自分が起動シェルであれば、カレントディレクトリに .fxin というファイルがあるかどうかを調べ、もしあればそれを実行します。 .fxin はFENIXシステム自身の初期設定を行うためのシェルスクリプトです。

★ 内部コマンド

以下はシェルに内蔵されているコマンドの解説です。 これらは外部コマンドより優先されて実行されますので、同じ名の外部コマンドを実行することはできません。 ただ、パス名を付ければ実行可能です。

なお、複数のファイル/ディレクトリ名を入力として受け取るコマンドは、 ワイルドカードを用いた一括指定が可能です。

書式説明

[・・・]  括弧内の要素が省略可能であることを表します。
{・・・}  括弧内の要素を必ず指定しなければならないことを表します。
a|b   a か b のどちらかであることを表します。
a-z   a から z までのいずれかの文字であることを表します。

☆ cd/chdir

[形式]  cd/chdir [directory]
カレントディレクトリを移動します。
指定を省略するとカレントドライブのルートディレクトリに移動します。

☆ pwd

[形式]  pwd
カレントディレクトリ名を標準出力に出力します。

☆ md/mkdir

[形式]  md/mkdir directory・・・
ディレクトリを作成します。

☆ rm

[形式]  rm [-i] filename・・・
ファイルを消去します。

 [オプション]
i  消去する前に確認を求めてきます。

☆ rd/rmdir

[形式]  rd/rmdir directory・・・
ディレクトリを消去します。

☆ chmod

[形式]  chmod {+|-} filename・・・
ファイルのプロテクト状態の設定/解除を行います。

[オプション]
+  ファイルをプロテクトします。
-  ファイルのプロテクトを解除します。

☆ ls

[形式]  ls [-ahF1Cls] [directory|files]
指定ディレクトリに含まれるファイルを標準出力に出力します。

[オプション]
a   "." で始まるファイルも出力します。普通は "." で始まるワイルドカードで指定しないと表示されません。
h   -1 , -C オプションによる出力の場合ヘッダが出力されませんが、強制的にヘッダを出力します。
F   ディレクトリ名の後ろに / を、OBJ ファイルの後ろに * をつけます。
1   1行に1ファイルしか表示しません。出力をリダイレクトした場合のデフォルトモードです。
C   横にファイルを並べて出力します。画面出力の場合のデフォルトモードです。
l   BASICの files と同様の形式で出力します。
s   l オプションと同じような形式ですが、日付の代わりにサイズ、開始アドレス、実行アドレスを表示します。

☆ cp

[形式]  cp [-i] filename1 filename2
      cp [-i] filename ・・・ directory
ファイルコピーを行います。上の書式だとファイルを別の名前でコピーし、下の書式だとそのままの名前で指定ディレクトリにコピーします。
上の書式でファイルを自分自身にコピーしようとすると、エラーが出る上にファイルが消えてしまいます。注意して下さい。
コピー先ファイルが既に存在する場合、ライトプロテクトしておかないと上書きされてしまいます。プロテクトしておくと絶対上書きされません。


 [オプション]
i  コピー先ファイルが既に存在する場合、上書きするかどうか確認してきます。

☆ cat

[形式]  cat [filename・・・]
指定ファイルを連続して標準出力に出力します。 ファイル名を省略すると標準入力から読み込みます。
元々がテキストファイルを連結するためのコマンドなので、扱うファイルはBSDに限られます。

☆ more

[形式]  more [file/object]
ファイル/オブジェクトの内容を文字コードで画面に表示します。 引数を省略すると標準入力から読み込みます。 ファイル/オブジェクトの形式は何でも構いません。
1画面分表示するごとに停止します。ここで、以下のキーが有効となります。
SPACE次の1画面分を表示します。
CR次の1行を表示します。
Q終了します。

☆ load

[形式]  load [-bdt] filename
指定ファイルをオブジェクトとしてロードします。 デフォルトでは OBJ は bin、BSD は txt、BTX と BRD は dat としてロードされます。 オプションによってタイプの変更ができます。 変数 PATH によって検索ディレクトリを指定できます。

[オプション]
b  bin タイプのオブジェクトとしてロードします。
d  dat タイプのオブジェクトとしてロードします。
t  txt タイプのオブジェクトとしてロードします。

☆ save

[形式]  save [-obsr] objectname [directory]
オブジェクトを指定ディレクトリにセーブします。 デフォルトでは bin,dat は OBJ、txt は BSD としてセーブされますが、いずれも 64KB 以上の場合は BRD としてセーブされます。 オプションによってタイプの変更ができます。

[オプション]
o  OBJ タイプのファイルとしてセーブします。
b  BTX タイプのファイルとしてセーブします。
s  BSD タイプのファイルとしてセーブします。
r  BRD タイプのファイルとしてセーブします。

☆ whereis

[形式]  whereis filename
変数 PATH で指定された検索ディレクトリ中から指定されたファイル名を探し出し、そのパス名を標準出力に出力します。

☆ kill

[形式]  kill [-f] objectname
オブジェクトを消去します。 f オプションをつけると、書き込み許可がないものでも強制的に消去します。 ただし、TSRで登録されていると管理テーブルの情報が残ってしまいますし、最悪の場合暴走します。 オプションはよほどの非常時以外には使わないで下さい。

☆ ps

[形式]  ps
オブジェクトの状態を標準出力に出力します。 数値はいずれも16進数です。

MB# というのは確保されているメモリブロックの数です。

☆ echo

[形式]  echo [word・・・]
引数を標準出力に出力します。

☆ init

[形式]  init devicename
デバイスの初期化を行います。書式はBASICと同じです。

☆ vram

[形式]  vram {1-4}
BASICの option screen と同じ動作を行います。

☆ kmode

[形式]  kmode {0-2}
BASICの kmode と同じ動作を行います。

☆ cls

[形式]  cls [1-3]
BASICの cls と同じ動作を行います。

☆ newon

[形式]  newon {0-5}
BASICの new on と同じ動作を行います。

☆ mon

[形式]  mon
モニタを起動します。詳しくはBASICマニュアルを参照して下さい。

☆ ver

[形式]  ver
シェルのバージョンを標準出力に出力します。

☆ stty

[形式]  stty eof eof_code
主に標準入出力に関する設定を行います。 Ver0.2 では標準入力のEOFコードを設定することができるだけです。 fsh 起動時は
stty eof \{Q}
が実行されているのと同じ状態です。

☆ history

[形式]  history [-][n]
過去に入力されたコマンドを表示します。 n で数値を指定すると、一番古いものからn個表示します。 数値を指定しなければ、全てのコマンドを表示します。 - をつけると、一番新しいものから表示します。
ヒストリバッファは1KB用意されていて、バッファが一杯になると古いものから順に消去されます。

☆ !

[形式]  ! [str]
history と同じく、過去に入力されたコマンドを表示します。 文字列 str を指定すると、str で始まるコマンドを全て表示します。 文字列を指定しなければ、全てのコマンドを表示します。

☆ !!

[形式]  !!
ひとつ前に実行したコマンドを表示します。

☆ set

[形式]  set [var_name [value]]
変数を設定します。値は0個以上のワードです。 詳しくは変数の説明をお読み下さい。
また、引数を省略すると、設定されている変数の一覧を表示します。

☆ unset

[形式]  unset var_name
変数を消去します。

☆ boot

[形式]  boot
ブートします。 当然IPL起動からやり直しとなります。

☆ exit

[形式]  exit
シェルを終了します。 この時に自分が起動シェルであれば、.fxout というファイル(オブジェクト)を探し、あれば実行します。

★ シェルのソフトウェア割り込み

fsh Ver0.11b 以降は FXC .SHELL に対応しており、ユーザーアプリケーションから FXC .SHELL を実行することでシェルの機能を使うことができます。 以下にファンクションの一覧を示します。 機能番号はCレジスタで指定します。

☆ FSH_VER   機能番号 0

FXC .SHELL の登録状況の確認及びシェルのバージョンチェック
入力 :---
 
出力 :Cf=0 (.SHELL 登録チェックに使用)
 A  シェル番号(=0)
 HL バージョン番号(=0200H)
 
破壊:AF,HL
FXC .SHELL は、カーネル内処理ではCf=1となってリターンしますので、このファンクションを実行後キャリーを調べることによって.SHELLがシェルによって使用されているかどうかをチェックすることができます。

また、シェル番号はほとんど無意味です。(fsh なら 0) バージョン番号は、Ver0.11b なら 0112H、Ver0.2 なら 0200H といった具合です。

バージョンの違いから生じる機能の差によってアプリケーションに負担をかけるのはFENIXの思想に反していますので、アプリケーションを作る方はバージョン番号など気にせず、最新の fsh にのみ対応して下されば結構です。


☆ FSH_LOAD   機能番号 1

PATH 変数指定を有効とし、オブジェクトをロードする。
入力 :DE ファイル名へのポインタ (コモンエリア内)
 A  オブジェクトタイプ(1;bin , 2;dat , 3;txt , 0;default)
 
出力:A  オブジェクトID
 
破壊:AF,裏レジスタ
FXC .LOADOBJ と完全互換にしています。
KEYBUF,BUF2 が破壊されます。(入力バッファは KEYBUF,BUF2 でも構いません。)

☆ FSH_WHERE   機能番号 2

PATH 変数指定を元にして、ファイルを検索する。
入力 :DE ファイル名へのポインタ (コモンエリア内)
 
出力:Cf=0 ; DE パス補完したファイル名へのポインタ
 Cf=1 ; ファイルが見つからない
 
破壊:AF,DE,裏レジスタ
fsh のコマンド whereis と同じ動作をします。 KEYBUF が破壊されます。(入力バッファは KEYBUF でも構いません。)

☆ FSH_VAR   機能番号 3

変数の値を求める。
入力 :DE 変数名へのポインタ (コモンエリア内)
 A  ワード番号(1〜ワード数。0なら全ワードを求める)
 
出力:Cf=0 ; DE 値(ワード)へのポインタ
 Cf=1 ; エラー
     A= 0;変数未定義
     A<>0;ワード番号オーバーフロー
 
破壊:AF,DE
全ワードを参照したときの出力フォーマットは、DEの示すアドレスから
第1ワード,00,第2ワード,00,…,最終ワード,00,00
となります。 出力バッファには KEYBUF が使用されます。

☆ FSH_EXEC   機能番号 4

1行のテキストを解釈し、実行する。
入力 :DE 入力テキストへのポインタ (コモンエリア内)
 B  エラー設定フラグ
   B= 0 ... エラー発生時はシェルに戻る。
   B<>0 ... (HL+0)-(HL+6) ; マッピングデータ(実MB)
        (HL+7)-(HL+8) ; ジャンプアドレス
 
出力:---
 
破壊:全レジスタ
シェルの1行入力・実行と同等です。

エラー処理をアプリケーション側で行う場合は、(HL)-(HL+8) にエラー時のマッピング・ジャンプ先のデータを設定しておく必要があります。 ただしこれは実MBのデータです。.MAPMEM に渡す形式のデータではありません。 また、このデータはコモンエリア内になければなりません。

アクティブオブジェクトIDが変更される可能性があります。


☆ FSH_SUB   機能番号 5

シェルの入力待ち状態に移行する。
入力 :---
 
出力:---
 
破壊:全レジスタ
exit 命令の実行によって呼び出し元に帰ります。 この機能実行中に入力されたコマンドはヒストリに記録されません。

また、呼び出し元に帰ってきた時には、アクティブオブジェクトIDが変化している可能性がありますから気をつけて下さい。


☆ FSH_ERR   機能番号 6

エラーから復帰する。
入力 :---
 
出力 :---
 
破壊:全レジスタ
FSH_EXEC を用いてエラーが生じた際に、アプリケーション側でエラー処理を行った場合は、必ずこのファンクションを呼び出して下さい。

☆ FSH_VWHERE   機能番号 7

指定した変数を元にして、ファイルを検索する。
入力 :DE ファイル名へのポインタ (コモンエリア内)
 HL 変数名へのポインタ (コモンエリア内)
 
出力:Cf=0 ; DE パス補完したファイル名へのポインタ
 Cf=1 ; ファイルが見つからない
 
破壊:AF,DE,裏レジスタ
PATH 以外の変数を元にしてファイル検索を行ないます。 KEYBUF が破壊されます。(入力バッファは KEYBUF でも構いません。)

☆ FSH_ADDCMD   機能番号 8

オブジェクト内のコマンド群をシェルの内部コマンドに追加する。
入力 :A  オブジェクトID
 HL コマンド管理テーブルアドレス
 
出力 :Cf=0 ... 登録成功
 Cf=1 ... 登録失敗
 
破壊 :全レジスタ
オブジェクトに含まれる複数のコマンドをシェルの内部コマンドとして使用できるようにします。 オブジェクトは 8000H 以降にマッピングされるものでなければなりません。 最大4個のオブジェクトを登録可能です。

HL で示す実アドレス以降にコマンド管理テーブルを置きます。 その内容は以下のように設定します。

(HL ) 〜 (HL+7) ... "extcmds",00 の8バイト。コマンド群であることの識別用。
(HL+8) 〜 ... コマンドデータ。以下のデータの繰り返し。
"コマンド名",00,呼び出しアドレス(下位・上位の順)
"コマンド名"が00ならばテーブルの終端を示す。

指定したオブジェクトがアクティブオブジェクトになり、このオブジェクトは書き込み禁止になります。


☆ FSH_DELCMD   機能番号 9

指定オブジェクトを登録コマンドから分離する。
入力 :A  オブジェクトID
 
出力:Cf=0 ... 分離成功
 Cf=1 ... 登録されていない
 
破壊:全レジスタ
FSH_ADDCMD によって登録された内部コマンドを分離します。 またTSRオブジェクトでなければオブジェクトに書き込み許可が与えられます。
FENIXのメインページに戻る