4

コマンドを実行したい:

nc localhost 9998

次に、スクリプトでファイルを監視し、ファイルが変更されるたびにファイルの内容をこのサブプロセスにエコーするようにします。

リダイレクトスキームがわかりません。サブプロセスの STDIN にアクセスするにはどうすればよいですか?

4

4 に答える 4

2

どうですか

tail -f $file |nc localhost 9998

編集:

すでにバッファがあるので、次のようなことを試すことができます:

while [ 1 ]; do
    # Your stuff here.
    buf=yourfunctionhere
    buffer=$buffer$buf

    if [ ! -z $buffer ]; then
        echo $buffer |nc localhost 9998
        # Empty buffer on success.
        if [ $? -eq 0 ]; then
            buffer="";
        fi
    fi
done
于 2011-07-06T10:31:13.087 に答える
1
mkfifo X
some_program <X >output &
create_input >X

some_programcreate_input書き込みがあるまで X の読み取りをブロックします。

于 2011-07-06T14:01:15.853 に答える
0

diff と単純な bash スクリプトを使用して解決策を見つけました。

次のスクリプトcat $file > $namedpipeは、ファイルの変更時に実行されます。これは私が作ったスクリプトですcheck-file.sh

#!/bin/bash

file=$1

tmp=`mktemp`
cp "$file" "$tmp"
namedpipe=`mktemp`
rm -rf $namedpipe
mkfifo $namedpipe

function cleanup() {
    echo "end of program"
    rm -rf $tmp
    rm -rf $namedpipe
    exit 1;
}

trap cleanup SIGINT
tail -f $namedpipe 2> /dev/null | netcat localhost 9998 &
while true; do
    diff=$(diff "$file" "$tmp")
    if [ ! -z "$diff" ]; then
        cat $file > $namedpipe
        cp $file $tmp
    fi
    sleep 1
done

このスクリプトは、ファイルの名前を入力として受け取ります。たとえば、環境で次のコマンドを試してください (netcat -l 9998実行中):

touch /tmp/test
bash check-file.sh /tmp/test &
echo "change 1" > /tmp/test
sleep 1
echo "change 2" > /tmp/test
sleep 1
echo "change 3" > /tmp/test

:一時ファイルはトラップによってクリーンアップされるため、このスクリプトを正常に中断できます。

于 2011-07-07T03:59:18.283 に答える
0

私が受け入れられると思った2つの解決策:

1) coprocess を使用します。このようにして、COPROC[0/1] 配列を介して、coprocess コマンドによって作成されたプロセスの stdin および stdout にアクセスできます。

2) 私が最終的に行ったことは、以下に示すように、アプリケーションを 2 つのコード ブロックに分割することです。最初のブロックは stdout に書き込み、それが 2 番目のブロックの stdin にパイプされます。これにより、2 番目のコード ブロックで netcat に問題がある場合に、データをバッファリングするクリーンな方法が得られます。

{ while true;
  write to STDOUT; } |
{ while true
  nc localhost 9998 }

(実際には、netcat が接続できない場合に 2 番目のコマンドがディスクへのバッファリングを提供するため、スクリプトははるかに複雑ですが、パイプを使用するとバッファリングが提供されるため、ネットワークの問題によって netcat が中断されたときにデータが失われることはありません)

于 2011-07-07T03:30:00.887 に答える