毎秒 EOF を使用して fifo にデータをパイピング

毎秒 EOF を使用して fifo にデータをパイピング

いくつかの生のバイナリデータをfifo(out.pipe)にパイプし、EOFが定期的に送信されることを確認しようとしています。次の行が私が望むことをしない理由を理解することはできません。

while true; do read -t 1 -N 128 line; echo -n $line > out.pipe; done

タイムアウトが発生すると、null値が与えられたように見え$line、発生しなくても入力からすべての改行が削除されます。これは何が起こるべきかについての私の理解ではありませんこのファイル:

-N文字

EOFや読み取りタイムアウトが発生しない限り、入力行全体を待たずに正確にnchars文字を読み取った後、読み取りが返されます。入力で見つかった区切り文字は特に処理されず、nchars文字を読むまで読み取りは返されません。

-t 時間超過

入力行全体(または指定された文字数)をタイムアウト秒以内に読み取らないと、読み取りタイムアウトが発生し、失敗が返されます。 timeout は、小数点の後に小数部がある 10 進数です。このオプションは、読み取りが端末、パイプ、またはその他の特殊ファイルから入力を読み取る場合にのみ有効です。通常のファイルから読み込むときは効果がありません。読み出しがタイムアウトした場合、読み込みは指定された変数名に読み込まれた部分入力を保存します。タイムアウトが 0 の場合、読み取りはデータの読み込みを試みずにすぐに返されます。指定されたファイル記述子で入力が使用可能な場合、終了ステータスは 0 で、そうでない場合は 0 ではありません。タイムアウトを超えると、終了ステータスは128より大きくなります。

-N 128にパラメータがなく、パラメータがreadない場合、これは私が望むものに非常に近いです。問題は、改行が特に処理され、データが渡されない場合でも送信されることです。-necho

while true; do read -t 1 line; echo $line > out.pipe; done

私は次の行を使ってパイプラインに何が入っているのかをテストしてきました。

while true; do cat out.pipe; done

stdinを介した入力転送とwithを介したHTTPデータ転送をテストしましたが、echo -e "GET / HTTP/1.1\r\nHost: hostname\r\n\r\n" | nc localhost 80 | myreadcommand孤独な文字が\r非常に混乱しています。

私が理解していないものは何ですか?これを行うより良い方法はありますか?私は何を見逃していますか?

ベストアンサー1

readマニュアルページには次のように記載されています。

ターミネータ<newline>(存在する場合)は入力から削除し、結果はシェルのパラメータ拡張結果と同様にフィールドに分割する必要があります。

また、新しい行の処理方法について渡したパラメータに基づいて複数の例外を記録します。そのような例外が重要な場合は、マニュアルページ全体を読んでください。

たとえば、特定の文字を無視するには、\r次のように簡単に実行できますsed

echo "hi\r\nI am a script" | sed "s/\r//g"

交換をより明確にするには、次のような他のものと交換できます。

echo "hi\r\nI am a script" | sed "s/\r/,/g"

-efor引数を使用すると、echo入力内の実際の改行文字と実際に一致しないバックスラッシュ特殊文字の組み合わせを解釈することに注意することも重要です。

おすすめ記事