次のスクリプトを使用して単純な CGI サーバーを作成しようとしていました ( http://www.jfranken.de/homepages/johannes/vortraege/netcat_inhalt.en.htmlから)。これは、これが良いアイデアであるかどうかよりも、機能しない技術的な理由に関するものです。
#!/bin/bash
export port=${port:-$1} # inherit $1 as $port
/usr/local/bin/nc -l -p $port -e $0 & # await further connections on this port
echo "hi"
これが適切に機能しない理由を誰かが知っていますか? 最初の実行時に、端末に「こんにちは」と出力されます。次に、netcat が指定されたポートで待機し、ネットワーク ソケットに関連付けられた STDOUT を使用してこのスクリプトの新しいコピーを生成する準備ができていることを期待します (-e フラグのため)。したがって、指定されたポートへの HTTP GET 要求は、テキスト「hi」を受け取ります。
実際に何が起こるかというと、各 GET リクエストによって新しい netcat プロセスが一度に 1 つずつ生成されますが (これは予想どおりです)、最新の netcat プロセスを強制終了するまで GET リクエストは完了しません。その時点で、発行した最初の GET リクエストは「こんにちは」で応答し、他のすべてのリクエストは接続試行の失敗として返されます。これは、STDOUT リダイレクトの詳細に関する私の混乱と関係があると思われますが、私の理解では、このスクリプトは誰かが接続するたびに新しいバージョンを生成するだけであり、スクリプトの STDIN/OUT はネットワーク ソケットである必要があります。 -e netcat フラグのためです。