[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[FDclone-users:00053] Re: FDclone 2.02 has been released



 しらいです。

In Message-Id <20021125185308.A52EF53AF9@yuka.unixusers.net>
        Takashi SHIRAI <shirai@unixusers.net>writes:
>  しらいです。

>  以下は HISTORY より今回の変更点の抜粋です。

 簡単な解説を入れておきます。


> 	組込みコマンド pushd, popd, dirs の追加。

 Bourne shell にも POSIX shell にも規定されていない builtin
ですが、interactive shell であれば是非実装すべきであるという
声が多かったので実装しました。


> 	組込みコマンド cd, pwd に -L, -P オプションの追加。
> 	組込みコマンド set に -o physical オプションの追加。

 これは Korn shell 由来の option ですね。FDclone はそもそも
-L 相当の cd を実装していましたが、shell ならば本来は -P 相
当の cd を用意すべきで、その差異を補うために option で対応し
ました。


> 	%JA マクロの追加。

 SJISPATH とか CAPPATH とかで、directory 毎の漢字コードを指
定出来るのであれば、pathname から自動的に判断して相応の漢字
コードに変換するようなマクロがあってもいいかと思って実装して
みました。


> 	内部変数 MAIL, MAILPATH, MAILCHECK の追加。

 これって最早時代遅れの実装だと思うんですね。local に mail
spool があるのが当たり前だったのはひと昔前の話で、今だとこの
用途には POP3/IMAP 対応していないと無意味だと思うんです。
 でも、Bourne shell には実装されていますし、POSIX shell で
すら規定されてしまっているので、一応実装してみました。


> 	POSIX に合せて置換 ${#foo}, ${foo%bar}, ${foo#bar} の追加。
> 	POSIX に合せて展開表現 $(command), $((expression)) の追加。

 単に POSIX に準拠しただけです。実装が面倒な割には余り便利
になった印象を受けないんですが、どうして POSIX ってこう要ら
ない機能を折込みたがるんでしょうね。
 特に $(command) の実装は仕様ミスだと思いますね。「)」って
identifier としては意味を持ち過ぎで、既に sub shell の () と
関数の () と case の ) と三種類も使われてしまっている訳です。
 実際、ksh や bash では $() の中に case statement を記述出
来ないという bug があったりしますし。ash は記述出来るようで
すが。
 仕様を決める時はちゃんと考えてから決めなくては。


> 	組込みコマンド dtype の追加。(MS-DOS 版)

 COMMAND.COM に内部コマンド TYPE があるのを忘れていました。
shell builtin の type は別の意味で使われているので、頭に「d」
を冠してあります。


> 	組込みコマンド dir に /S, /4 オプションの追加。(MS-DOS 版)

 この辺りは何となく実装洩れしていたものです。/4 は Windows
拡張なので必須ではないでしょうが、/S の方は MS-DOS 5.x から
実装されているので載せないとまずいでしょうね。


> 	fdsh のコマンドライン入力長を 2 行から 255 文字に拡大。

 別に何文字で制限しても構わないのですが、FDclone 時はともか
く shell 形態の時にまで行志向なのはまずいかと思って改良しま
した。
 これに伴い、USEGETCURSOR 未設定時でも fdsh の行編集が有効
になっていると思います。


> 	セキュリティのため一時ファイル名を乱数で生成するように改良。

 一時ファイル名は「_」から順に「ABC...Zabc...z012...9」の中
から使われていない filename を探して使っていましたが、それだ
と容易に類推可能ということで乱数生成に変えました。
 但し、そんなに精度の高い乱数は必要ないと思っているので、一
番精度の低い rand() 相当の計算にしてあります。もし精度が必要
ならば MD5 を使った実装に置き換えますが、その必要性を感じる
方がいらしたら主張して下さい。
 不必要に計算量を増やして遅くしても意味ありませんから。


> 	フロッピードライブ上に「.」「..」が現れないバグを修正。
> 	フロッピードライブを引数にして起動するとパスが壊れる点を修正。
> 	フロッピードライブの空き容量計算ミスを修正。

 ごめんなさい。この辺り全然気づいていませんでした。


> 	ヒアドキュメント(<<) がステートメント内で使えないバグを修正。

 here document のために一時ファイルを作るのが無駄に思えたの
で、その場で読込む実装にしてあったのですが、よくよく考えてみ
るとその実装では関数にも loop にも使えないのでした。
 Bourne shell の実装では一時ファイルに展開しているので、そ
れを踏襲しています。UNIX では一時ファイルは作成直後に unlink
出来るのですが、敢えてそういう実装にはしていません。


> 	先行ファイル表示時に一部のコマンドが誤動作する点を修正。

 先行ファイル表示機能が働いている時は、名前だけ判っている分
は file だか directory だか区別がつかないので、カーソル位置
の分だけはコマンド実行時に stat() しないといけないというお話
でした。


> 	シェルのコマンドライン引数の評価をより厳密に。

 Bourne shell の source を見ながら再実装した訳ではないので、
後付けで同じ挙動を再現しようとすると色々無理があるようです。
結構厄介な問題ですね。


> 	RRPATH と FNAMEKCODE が重複して機能しなかった点を修正。

 TRANS.TBL が一体どういう漢字コードで書かれている筈なのかと
いう考えオチ的な bug でした。


> 	DJGPP と Borland C++ 環境での CON のリダイレクトの支障を修正。

 これは DJGPP と Borland C++ の O_BINARY の扱いの差異に依存
するものです。どちらかと言うと library の bug だと思うんです
けどね。
 Borland C++ では何故か O_TEXT で open しないと echoback が
返らなくて、DJGPP では何故か dup() 時に text/binary の区別が
継承されないようです。
 それもこれも、改行コードを \r\n の 2bytes に規定した MS が
悪いんですが。


> 	カスタマイザの設定保存機能が正しく働いていなかった点を修正。

 current directory 以外の設定ファイルに上書きしようとすると、
全然違うところに backup を作成しようとしてハマってました。


> 	生 MS-DOS 環境でディレクトリ書込み出来ないことがある点を修正。

 生 MS-DOS では directory の rename が出来ないんですね。忘
れてました。mkdir()/rmdir() で実現してありますが、それすると
今度は timestamp がずれます。
 生 MS-DOS では directory の timestamp 変更も出来ないんです
よ。しおしお。

                                               しらい たかし