現在のプロセスをそのコプロセス/子で置き換えます


10

P「Hello」を受け取り、「Why?」を出力することを期待するプログラムがあります。機能を提供する前に。この機能は、「こんにちは」との会話を開始することが礼儀であることを認識していない他のプログラムによって使用されます。したがって、次のように機能するラッパーを記述したいと思いPます(zsh構文)。

coproc P
print -p Hello  # Send Hello to P
read -pr line   # Read what P has to say
[[ "$line" = "Why?" ]] && Replace current process with the coprocess.
echo Could not get P's attention.

使用するcatddReplace...一部(のようなものはcat <&p &; exec cat >&p)不要なバッファリングになります。私のオプションは何ですか?


あなたがしたいですかzsh解決策をかでbash受け入れ可能な解決策?
roaima 2015年

1
bash適用できない解決策には失望しますが、zsh確かにそれを受け入れます☺
Michaël15年

他のプログラムがこのスクリプトを実行することはわかっていますか?有限のリストですか、それとも任意の数ですか?明らかに、他のプログラムはそれを呼び出すためにこれについて知る必要があります。
Lizardx 2015年

私の典型的な用途は、sshとそのオプションProxyCommandでした。
ミカエル

1
cat通常はバッファリングしません。システムで問題が発生する場合は、を試してくださいcat -u
ステファンChazelas

回答:


1

あなたが述べた問題は、実際にはプロセスを置き換えることではなく、既存のプロセスのストリームを置き換えることです。目標は、プロセスと少し対話し、その入出力を接続された別のストリームのペアに引き渡すことです。

これを直接行う方法はありません(少なくとも、シェルでは、プロセス内では、dup2呼び出しが機能すると考えられます)。ストリームをスプライスする必要があります。すなわち:

( echo Hello ; cat ) | P | ( read ; cat )

coprocあなたの例のように使っても大丈夫です。このコマンドはファイル記述子を配列に保存し、後でリダイレクトに使用できることに注意してください。

Pが接続されている入力/出力ストリームを検査し、それに基づいてバッファリングすることを決定しない限り、これは追加のバッファリングを引き起こしません(少なくともGNU catでは)。たとえば、C標準ライブラリは、ファイルに接続されている場合はstdout/でのバッファリングを有効stderrにしますが、端末に接続されている場合のみ行バッファリングを実行します。


-1

バッファリングを回避するためにperlを使用して以下のコードでテストできます。これが機能するかどうか試してください

Pのサンプルバージョン

$ cat /tmp/P
#!/bin/bash
read input
if [[ $input = "Hello" ]]
then
    echo "Why?"
else
    exit 1
fi
echo "Got Hello from client, working ..."
sleep 10
echo "Need to read some input"
read x
echo "Got: $x"

ラッパープログラム

$ cat /tmp/wrapper 
#!/usr/bin/zsh
coproc /tmp/P
print -p Hello  # Send Hello to P
read -pr line   # Read what P has to say
if [[ "$line" = "Why?" ]]; then
    perl -e '$|=1;print $_ while(<>);' <& p &
    perl -e '$|=1;print $_ while(<>);' >& p
else
    echo "Could not get P's attention."
fi

試運転

$ /tmp/wrapper 
Got Hello from client, working ...
Need to read some input
hi there P!   <== Typed in at teminal
Got: hi there P!

これは、dd ibs=1たとえばを使用する場合と同じです。私はこれで大丈夫ではありません。ある意味で、coprocには独自のバッファリングがあり、これが私が使用したいものです。
ミカエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.