Ответ 1
Он перенаправляет строку в stdin команды.
Переменные, назначенные непосредственно перед командой таким образом, вступают в силу только для процесса команды; оболочка остается нетронутой.
Что делает оператор bash < как внутри следующего блока кода? И как получилось, что $IFS остается пространством, а не периодом?
LINE="7.6.5.4"
IFS=. read -a ARRAY <<< "$LINE"
echo "$IFS"
echo "${ARRAY[@]}"
Он перенаправляет строку в stdin команды.
Переменные, назначенные непосредственно перед командой таким образом, вступают в силу только для процесса команды; оболочка остается нетронутой.
От man bash
Здесь строки Вариант здесь документов, формат:
<<<word
Слово расширяется и передается команде на его стандартный ввод.
.
в строке IFS эквивалентно source
в bash.
Обновление: Больше от man bash
(Спасибо, gsklee, sehe)
IFS Внутренний разделитель полей, который используется для разбиения слов после расширения и разделить строки на слова с чтением встроенная команда. Значение по умолчанию - "
<space><tab><new‐line>
".
еще больше от man bash
Среда для любой простой команды или функции может быть дополнена временно путем префикса его назначением параметров, как описано выше в ПАРАМЕТРЫ. Эти утверждения присваивания влияют только на среду, видимую этой командой.
Причина, по которой IFS не установлена, заключается в том, что bash не видит это как отдельную команду... вам нужно поставить строку или точку с запятой после ее завершения:
$ cat /tmp/ifs.sh
LINE="7.6.5.4"
IFS='.' read -a ARRAY <<< "$LINE"
echo "$IFS"
echo "${ARRAY[@]}"
$ bash /tmp/ifs.sh
7 6 5 4
но
$ cat /tmp/ifs.sh
LINE="7.6.5.4"
IFS='.'; read -a ARRAY <<< "$LINE"
echo "$IFS"
echo "${ARRAY[@]}"
$ bash /tmp/ifs.sh
.
7 6 5 4
Я не уверен, почему это было первым способом, но не синтаксическая ошибка.