だから私はsocatが常に接続を聞き、最初のx行を取得し、メッセージで応答したいと思います。理想的には、カスタム関数を使用してそのロジックを処理したいのですが、これを達成する方法を見つけることはできません。
私のシナリオ:
client 1:
cat <(printf "line1\nline2\n") -|nc socat_server socat_port
client 2:
cat <(printf "line3\nline4\n") -|nc socat_server socat_port
私が得たいもの:line1、line3、およびクライアントメッセージ(例:EXIT)
私は以前試しました:
exec {fd}> >(my_custom_function)
socat tcp-listen:10000,reuseaddr,fork system:"head -n1>&$fd;echo EXIT;exit"
ただし、「無効なFD番号」が表示されます。この問題を解決する方法はありますか?
ベストアンサー1
の場合、{fd}> file
値は$fd
9より大きくなります。
このシェルコードを解釈するにはsystem:shell-code
、socat
呼び出しを使用します。sh
sh
実装では、リダイレクト演算子で 9 より高い fd をサポートする必要はありません。実装もdash
実装mksh
もしません。また、ksh93(この構文をサポートするzshとbashの3つのシェルのうちの1つ)は、exec {fd}> file
取得したfdにclose-on-execフラグを表示するため、そこから継承されませんsocat
。
したがって、ここでは10未満のfdを使用する必要があります。
exec 4> >(my_custom_function)
socat tcp-listen:10000,reuseaddr,fork system:"head -n1>&4;echo EXIT;exit"
または、zshなどのfds 9以降をサポートするシェルを呼び出します。
exec {fd}> >(my_custom_function)
socat tcp-listen:10000,reuseaddr,fork "exec:'zsh -c \"head -n1>&$fd;echo EXIT;exit\"'"
(でないksh93
)。