Согласно «читать -n» описание на странице руководства:чтения -N и IFS
-N nchars вернуться только после прочтения именно символы NCHARS, если EOF не встречается или читать раз вне, игнорируя любой разделитель
Однако, в ответ на следующую команду:
$ echo 'a b' | while read -N1 c; do echo ">>>$c<<<"; done
>>>a<<<
>>><<<
>>>b<<<
>>><<<
как пространство и символ новой строки были переведены на пустую строку, в то время как в команде:
$ echo 'a b' | while IFS= read -N1 c; do echo ">>>$c<<<"; done
>>>a<<<
>>> <<<
>>>b<<<
>>>
<<<
пространство и новая линия были правильно сохранены в переменной.
Итак, у разделителей все еще есть обработка в команде «читать» или «пока», что я не понимаю.
Мы могли бы сравнить эти результаты с теми, с помощью «чтений -n», что руководство описывается как:
-n nchars вернуться после прочтения символов NCHARS вместо того, чтобы ждать новой строки, но если меньше чтить разделитель чем NCHARS символы читаются перед разделителем
$ echo 'a b' | while read -n1 c; do echo ">>>$c<<<"; done
>>>a<<<
>>><<<
>>>b<<<
>>><<<
$ echo 'a b' | while IFS= read -n1 c; do echo ">>>$c<<<"; done
>>>a<<<
>>> <<<
>>>b<<<
>>><<<
Отличное объяснение, но еще одна открытая точка, новая строка в случае (4), которая обрабатывается иначе, чем пространство, даже если ни одно из них не относится к IFS. То есть, я думаю, что в случае (3) мы не можем сказать «0x0a, а символ пробела возвращает пустую строку, так как оба эти символа находятся в IFS по умолчанию». –
@pasabaporaqui - Вы совершенно правы: семантика ключа -n означает, что он избыточен, что '0x0a' находится в IFS. Я изменил обсуждение, чтобы сделать эту избыточность ясной. –
Отлично, просто редакционный комментарий в случае (2): «IFS unset» должен быть «IFS empty». –