dx (0.5版)
2002/08/30
dx は SSI (server side include) の機能を念頭に置いて、処理の対象とするドキュメントを HTML 形式に拘らずに、一般的なドキュメント処理を行うツールとしてデザインしました。
dx は SSI と同様に、ドキュメントの中に埋め込まれた環境変数をその値で置き換え、またコマンドはその出力で置き換えます。しかし NCSA の SSI に比べると構文がシンプルでかつ遥かに強力な機能を持っています。
注意: 0.5版であると言う事は、まだ試作品の域を出ていない事を意味しています。
実行法
用法:dx [-s][-e] [file [arg ... ]]
結果は標準出力に出されます。
ファイルが指定されない場合には標準入力のデータを処理します。
ファイルが指定された場合には、引数を与える事ができます。
オプションは次の通りです。
-s
: ファイルの先頭の1行をスキップします。-e
: エラーが発生した場合に処理を止めます。
文法
ドキュメントの中の以下に掲げる埋め込みを処理します。$variable
${commandline}
$[condition]{commandline}
ここに
variable
は環境変数で、commandline
はコマンド行、condition
はコマンド行を実行する条件です。$
に続けて環境変数名または "{
" または "[
" でなくては変換を受けません。"
]
" と "{
" の間に空白を入れるとエラーになります。
{commandline}
は複数の行に跨がっても構いませんが、[condition]
は1つの行に書きます。
コマンドは1つの行内に書いて下さい。
$$
は$
に変換されます。また行末の $
は改行を抑制します。
環境変数
ドキュメント内の環境変数$variable
はその内容に置き換わります。環境変数が存在しない場合には空文字列に置き換えられます。
環境変数名は単純形、即ち、英数字および下線記号からのみ構成されると仮定されています。
環境変数 $0, $1, $2, ...
$0 dx を起動した時の <code>file</code>
$1 dx を起動した時の最初の <code>arg</code> $2 dx を起動した時の第二の <code>arg</code> $3 ...</pre>
環境変数は現在のところ rc のような配列ではありません。(これは将来改善すべき部分です。) 従って
${cmd='ls -l' $cmd}を実行しても rc と同様に 'ls -l' なんてないよとエラーになります。
(rc はこの場合、
cmd=(ls -l) $cmdとします。)
コマンド行
${commandline}
はコマンドの出力に置き換わります。
コマンド行の処理はできるだけ rc をエミュレートしていますが、多くの機能が省略されています。
現在サポートされているコマンド行の形式は、
- コマンド行 := 単純コマンド; 単純コマンド; ...
- 単純コマンド := 代入並び コマンド 引数並び
- 代入並び := 代入 代入 ...
- 引数並び := 引数 引数 ...
- 代入 := 変数=値
だけです。即ち、パイプや I/O の切り替えはサポートされていません。
コマンド行の中でサポートされていない記号は以下の通りです。
<{|}>[]^()&`*?(引用符で括った文字列の中では使用できます。引用符の使い方は rc と同じです。)
コマンド、引数、変数、値に対して環境変数を使用できます。
環境変数の評価は rc と同様に引数毎に行われます。(この事はセキュリティの面から非常に大切です。)
環境変数$status
には、外部コマンドの終了ステータスがセットされます。
コメントは rc と同様に "#
" で使用できます。
"#
" 記号から "}
" (コマンドが次の行に跨がる場合には行末)までがコメントとして扱われます。コメントの中に "}
" を含む場合には引用符で括って下さい。
dx はコマンドパスを rc と同様に (., /bin)
の順で見ます。
注: コマンドとしては rc のスクリプトも使用できるので、これだけでも意外と強力なのです。
条件
$[condition]{commandline}
は condition
の評価が真であればコマンドの出力に置き換わります。condition
として現在サポートしているのは環境変数を評価する仕組、即ち、~ subject pattern pattern ...の形式と、コマンドの実行結果を調べる仕組み
command argument ...
だけです。後者の場合には、command が正常終了した場合に「真」と評価されます。
何れの場合にも否定演算子
!
を使用できます。演算子 !
は先頭に書きます。
単に ! だけの
$[!]{echo OK}のような条件文は意味を持っています。(直前の条件を否定します。)
rc と同様に環境変数 v が存在しても存在しなくても
~ $v *は真になります。存否を確認したい場合には
~ $v ?*
として下さい。(
*
は長さ 0 の文字列にもマッチングします。)
内部コマンド
内部コマンドには終了ステータスがありません。以下の3つの内部コマンドを持っています。
exit
del
cd
echo
exit
は dx の処理を終了します。del
は環境変数を消去します。(rc のように rm
を使うのでは他の OS へ移植できません。)echo
を内部コマンドにしたのは、終了ステータスを echo
によって変化させたくなかったからです。
効率
dx は rc に比べて効率よく処理します。それは dx が Web のサーバで使用される事を念頭に置いているからです。単に軽いだけではなく、出力をバッファリングします。それによって、小さなパケットがネットワークに流れる事を防いでいます。
他方バッファリングの結果として、バックグランドジョブを実行しても、全てのジョブが終了するまで次に進みません。(そのような仕事には向いていないと言う事です)
日本語文字コード
dx は utf-8 および euc(ujis) を処理します。jis は使えません。 sjis は問題が発生するかも知れません。
使用上の注意
dx を CGI として使用する場合には第1行目を#!/bin/dx -sとします。この行を dx の処理の対象から外すために
-s
が付けられています。