что значит while read oldrev newrev ref?

пробую выполнить файл с кодом

while read oldrev newrev ref
do
    echo "Ref $ref received."
done

после выполнения ввожу в консоль "любое значение" и ожидаю увидеть в ответе:

Ref любое значение received.

но там

Ref received.

То есть значение пустое.

Так ли оно должно работать, как я ожидаю?


Ответы (1 шт):

Автор решения: aleksandr barakin

вопрос относится не к программе git, а к программе bash (как следует из содержимого файла по приведённой ссылке), являющейся одной из реализаций posix-совместимой оболочки.

согласно стандарту posix, программа или встроенная в оболочку команда read должна прочитать одну строку из стандартного ввода, разбить её на слова, руководствуясь символами-разделителями из переменной окружения IFS (по умолчанию<space><tab><newline>), и присвоить их последовательно переменным окружения, имена которых переданы этой команде/программе в качестве аргументов.


в вашем случае на стандартный ввод команде/программе read передаётся строка, состоящая из двух слов — любое значение, а аргументов ей передаётся три — oldrev newrev ref.

соответственно, первое слово (любое) присваивается переменной окружения oldrev, второе слово (значение) присваивается переменной newrev, а переменной ref ничего не присваивается — недостаточно слов было передано.


while список1; do список2; done — это составная команда для организации цикла: сначала выполняется набор команд список1, если он завершился с ненулевым кодом возврата, то выполнение всей составной команды прекращается, иначе выполняется набор список2 и снова повторяется цикл с начала.

→ Ссылка