-Nフラグを使用してもスペースを「読み取る」のはなぜですか?

-Nフラグを使用してもスペースを「読み取る」のはなぜですか?

マニュアルによるとread(内蔵されているからではありませんがman readhelp read

-N ncharsEOF または読み取りタイムアウトが発生しない限り、すべての区切り文字を無視し、正確に NCHARS 文字を読み取った後にのみ返します。

しかし、-Nそのフラグを使用しても、read入力データから区切り文字を削除したいようです。次のデータを例に挙げます。

# readfail.sh - Reads 5 characters at a time, and adds "RegEx style" start and end characters for clarity
while read -r -N 5 data; do
    echo "^${data}\$"
done;

echo "^${data}\$"  # There will be data left over just because of the way `read` uses exit codes

出力は次のとおりです。

$ echo -n "Lorem ipsum dolor sit amet" | ./readfail.sh
^Lorem$
^ipsu$
^m dol$
^or si$
^t ame$
^t$

2行目の長さは4文字です。これはLoremとの間にスペースが必要なためですipsum。これにより、次の5文字が出力されます。^ ipsu$

IFS=ループの前に設定することでこの問題を解決できました。しかし、そうしてはreadいけません。無視する-Nフラグによる区切り記号はありますか?これはバグですか、それとも意図的な動作ですか?

答え1

-N行末の区切り文字は無視されます。 Bash は、文字が何であれ、指定された数の文字を正確に読み込みます。これは、読み取った内容がスクリプトに変数の内容として報告される方法とは何の関係もありません。これは一般的なIFS分割メカニズムを使用します。

関連情報