разделение файла here docs, когда каталог файла отличается от pwd

Нормальное поведение всех оболочек 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
1
25.10.2019, 08:02
0 ответов

Теги

Похожие вопросы