DosBoxで、パイプと 標準入力/標準出力の リダイレクトを実現してみよう

Pocket

DosBoxで、パイプと 標準入力/標準出力の リダイレクトを実現してみよう
DosBoxで、パイプと 標準入力/標準出力の リダイレクトを実現してみよう

序文

はい。

このところ、DosBox、CMD、CygWinラッパーのファイラーKeyCommanderの開発を行っているKaBAです。

その制作過程で、DosBox用のパイプと標準入出力リダイレクトができなかったため、なんとか実現できないものかと、無い知恵絞って作ってみたのが、今回のシェルスクリプトとラッパーバッチファイルです。

ちょっと扱いにくいですが、皆さんも、DosBox用のパイプと標準入出力リダイレクトに興味があられましたら、ぜひ読んでくださいね。

DosBoxでPipe(パイプ)と標準入出力のリダイレクトを行うバッチ/シェルスクリプト

DosBoxは、現在のところ、パイプや標準入力/標準出力のリダイレクトに対応していません。

しかし、DOS用Bshを子シェルとしてシェルスクリプトを実行することにより、パイプとリダイレクトを実行できます。

今回は、そのシェルスクリプト、及びそれを呼び出すラッパーバッチファイルを解説します。

shスクリプトはパブリックドメインフリーウェアのDOS用Bshを使用

DOS用Bshは、以前からパブリックドメインとして配布されていたものを使用します。

以下からダウンロードされてください。
shdos16.exeのzipのリンク

なお、ファイル名は、「shdos16.ex_」となっていますので、ウィルススキャン後、「shdos16.exe」に名前を変えてください。

その後、DosBox用のパスの通ったディレクトリに「shdos16.exe」をコピー&貼り付けしてください。

=== 2020/4/11 追記: ===

shdos16.exe は、元のファイル名はsh.exe で、Data Logic Ltd. という会社のフリーウェアのようでした。

====================

パイプとリダイレクトを行うバッチファイルとシェルスクリプト

実際のパイプとリダイレクトを行っているプログラムはシェルスクリプトですが、コマンドラインからシェルスクリプトにパラメータを渡すために、間に一段ラッパーバッチファイルを用意しています。

通常パイプとリダイレクトを行うには、このラッパーバッチファイル「pipe.bat」を呼び出します。
なお、「pipe」と打つのが面倒であれば、「p.bat」という名前にしてもかまいません。

この「pipe.bat」にパイプを行わせるには、「|」ではなく「:」を指定します。
また、リダイレクトについては、「<」を行わせるには「:[」、「>」を行わせるには「:]」を指定します。

これは、バッチファイルが「|」や「<」、「>」などに対応していないため、苦肉の策です。

しかし、これらを使用すると、パイプやリダイレクトが可能になります。

以下、ラッパーバッチファイル「pipe.bat」の内容です。

ラッパーバッチファイルpipe.bat
シェルスクリプトを呼び出す。

@echo off
set pg=

:check
if "%1"=="" goto final
if "%1"=="""" goto final
set pg=%pg% %1
shift
goto check
:final

echo shdos16.exe -c "pipe.sh %pg%"
shdos16.exe -c "pipe.sh %pg%"

set pg=

以下、パイプ・リダイレクトを行うシェルスクリプトです。

シェルスクリプトpipe.sh

CMDLINE=""
while [ "$1" != "" ]
do
  if [ "$1" = ":" ] ; then
  	CMDLINE="${CMDLINE} | "
  elif [ "$1" = ":[" ] ; then
  	CMDLINE="${CMDLINE} < "
  elif [ "$1" = ":]" ] ; then 
        CMDLINE="${CMDLINE} > "
  else
  	CMDLINE="${CMDLINE} $1"
  fi
  shift
done

shdos16 -c "${CMDLINE}"

実際の動作の様子

パイプの例

以下、パイプの例です。

pipe ls -l : more

pipe ls -l : more
pipe ls -l : more

pipe ls : sed -e 's/exe/EEE/g'

pipe ls : sed -e 's/exe/EEE/g'
pipe ls : sed -e ‘s/exe/EEE/g’

リダイレクトの例

次にリダイレクトの例です。

pipe ls :] list.txt

pipe ls :] list.txt
pipe ls :] list.txt

pipe cat :[ hello.txt

pipe cat :[ hello.txt
pipe cat :[ hello.txt

まとめ

皆さん大変お疲れ様でした。

ここまで読んで頂いて誠にありがとうございました。

本日の学びを以下にまとめます。

  • DosBoxでもパイプとリダイレクトは可能。ただし、子シェルとしてBshが必要。
  • Bshのシェルスクリプトと、ラッパーバッチファイルで、パイプとリダイレクトを疑似的に実行できる
  • あくまで、サンプルであり、まだまだブラッシュアップが必要かもしれない。

DosBoxでパイプとリダイレクトが可能であれば、なかなか自由度が広がるのではないでしょうか。

皆さんも、応用されて、ご自分のDosBoxの環境に適用されてください。

それではー またー (^_^)/