[unix] netcatでhttpサーバ その2

2018年8月27日月曜日

awk bash unix シェルスクリプト

coprocを使おう

[unix] netcatでhttpサーバ その1では fifo を使って、リクエストを処理した結果をパイプの前にいる netcat に返したけど、今度は bash のコプロセスを使ってやってみよう。
※子プロセスじゃなくて、コプロセスだよ。coproc は bash4 以降じゃないと使えないので、注意。
#!/bin/sh
trap 'wait' EXIT

while :
do
  coproc cotest { awk 'NR==1 { print $2; exit; }' | xargs -I{} cat '.'{}; }
  nc -l 8123 >&${cotest[1]} <&${cotest[0]}
  wait
done

6行目の coproc でリクエストを処理して、ファイルの内容を出力する処理を作る。この時点でバックグランドプロセスとして、動き出す。
coproc の直後に指定した名前で配列が作られて、ここには coproc で作ったプロセスの標準入出力とつながったファイルディスクリプタが格納されている。

cotest の標準入力に書き込むには >&${cotest[1]} 、標準出力から読み込むには <&${cotest[0]} とする。
これで、[unix] netcatでhttpサーバ その1同様にURLで指定されたファイルの内容を返すようになる。