Нормальное поведение всех оболочек Bourne/POSIX (dash, ksh, pdksh, mksh, bash, zsh, даже если они не находятся в режиме эмуляции sh, BusyBox sh, оболочки Bourne, … )заключается в том, что read -r line
удаляет начальные и конечные пробельные символы. В более общем случае read -r line
удаляет начальный разделитель, который состоит из произвольного числа пробельных символов из IFS
и не более одного не-пробельного символа из IFS
. В конце строки могут быть удалены только пробельные символы,потому что, если строка заканчивается символом-разделителем, отличным от -, то она заканчивается пустым полем. Это частный случай более общего случая :первая переменная получает первое поле, вторая переменная получает второе поле и т. д., и если полей больше, чем переменных, то последние переменные получают остаток строки кроме завершающего пробела.
Вызов read
с неявным именем переменной является расширением ksh, которое имитируют bash и zsh. В ksh (и ATT, и pdksh/mksh ), и в zsh read
без имени переменной точно эквивалентно read
с именем переменной REPLY
. В bash по какой-то причине поведение отличается :, когда имя переменной является неявным, IFS
удаление пробелов не выполняется. Это сделано преднамеренно, но от меня ускользает причина сделать это другим. (Если вы не хотите зачистки, стандартным методом является запуск IFS= read -r
.)
/* If there are no variables, save the text of the line read to the
variable $REPLY. ksh93 strips leading and trailing IFS whitespace,
so that `read x ; echo "$x"' and `read ; echo "$REPLY"' behave the
same way, but I believe that the difference in behaviors is useful
enough to not do it. Without the bash behavior, there is no way
to read a line completely without interpretation or modification
unless you mess with $IFS (e.g., setting it to the empty string).
If you disagree, change the occurrences of `#if 0' to `#if 1' below. */
if (list == 0)
{
#if 0
orig_input_string = input_string;
for (t = input_string; ifs_chars && *ifs_chars && spctabnl(*t) && isifs(*t
;
input_string = t;
input_string = strip_trailing_ifs_whitespace (input_string, ifs_chars, saw
#endif