fifoを使用したカスタムシェルによる再同期

fifoを使用したカスタムシェルによる再同期

fifoを使用して作成したカスタムシェルでrsyncを使用しようとしています。ただし、処理する方法が見つかりません。

initshfifoで標準シェルをシミュレートするスクリプト:

#!/bin/bash

rm fin
mkfifo fin
rm fout
mkfifo fout
rm ferr
mkfifo ferr
rm farg
mkfifo farg

read arg <farg
cat fin | /bin/bash -i -c "$arg" 1>fout 2>ferr

スクリプトはうまくいきます。以下を実行してテストできます。(cat fout &) && echo ls > farg

rsyncに渡すスクリプトrsh

#!/bin/bash

shift;
cat fout &
cat ferr 1>&2 &
echo "$@" | tee -a out > farg
cat | tee -a out > fin

sleep 2
kill %%
exit

rsyncを呼び出すには:

rsync -e './rsh' user@fakehost:/

実行すると正常に動作echo ./rshし、rsyncが待っているのと同じシェルを取得します。ただし、rsyncが実行されるとstdinを閉じないため、 "cat | ..."の停止(EOF)を待ちます。私もやってみましたがexec 0<>fin全然ダメですね。

ハンドルをしっかり閉める秘訣はありますか?それとも別の方法がありますか?

答え1

cat fout次のようにコマンドが終了するまで待つことができます。

#!/bin/bash

shift;
cat fout &
foutid=$!
cat ferr 1>&2 &
echo "$@" | tee -a out > farg
cat | tee -a out > fin <&0 &

wait $foutid

sleep 2
kill %%
exit

関連情報