Что означает оператор Bash <<<?

Что делает оператор bash < как внутри следующего блока кода? И как получилось, что $IFS остается пространством, а не периодом?

LINE="7.6.5.4"
IFS=. read -a ARRAY <<< "$LINE"
echo "$IFS"
echo "${ARRAY[@]}"

Ответы

Ответ 1

Он перенаправляет строку в stdin команды.

Переменные, назначенные непосредственно перед командой таким образом, вступают в силу только для процесса команды; оболочка остается нетронутой.

Ответ 2

От man bash

Здесь строки   Вариант здесь документов, формат:

     <<<word

Слово расширяется и передается команде на его стандартный ввод.

. в строке IFS эквивалентно source в bash.

Обновление: Больше от man bash (Спасибо, gsklee, sehe)

IFS Внутренний разделитель полей, который используется для разбиения слов    после расширения и разделить строки на слова с чтением    встроенная команда. Значение по умолчанию - "<space><tab><new‐line>".

еще больше от man bash

Среда для любой простой команды или функции может быть дополнена временно путем префикса его назначением параметров, как описано выше в ПАРАМЕТРЫ. Эти утверждения присваивания влияют только на среду, видимую этой командой.

Ответ 3

Причина, по которой 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

Я не уверен, почему это было первым способом, но не синтаксическая ошибка.