2

FIFO を作成し、出力を FIFO に書き込むプログラムを起動するスクリプトがあります。次に、プログラムが終了するまで、出力を読み取って解析します。

MYFIFO=/tmp/myfifo.$$
mkfifo "$MYFIFO"
MYFD=3
eval "exec $MYFD<> $MYFIFO"
external_program >&"$MYFD" 2>&"$MYFD" &
EXT_PID=$!

while kill -0 "$EXT_PID" ; do
  read -t 1 LINE <&"$MYFD"
# Do stuff with $LINE
done

これは、プログラムがまだ実行されている間に入力を読み取るとうまく機能しますが、読み取りのタイムアウトが無視され、外部プログラムの終了後に読み取り呼び出しがハングするようです。

私は他のスクリプトでタイムアウト付きの読み取りを正常に使用しました。また、外部プログラムを除外する単純なテスト スクリプトは正しくタイムアウトしました。ここで何が間違っていますか?

read -t編集:コマンドラインからスクリプトを実行すると期待どおりに機能するように見えますが、xcodebuild ビルドプロセスの一部として実行すると、タイムアウトが機能しません。これら 2 つの環境の違いは何ですか?

4

1 に答える 1

0

-tリダイレクトではうまくいかないと思います。

ここのマニュアルページから:

-t timeout
入力の完全な行が timeout 秒以内に読み取られない場合、読み取りがタイムアウトになり、失敗が返されます。read が端末またはパイプから入力を読み取っていない場合、このオプションは効果がありません。

于 2013-03-21T13:26:35.793 に答える