LINUX.ORG.RU

Bash, while + read + file descriptor

 ,


1

1

Привет! Встретился с реализацией вот такого скрипта на bash, почти разобрался с ним, только не могу понять как в этом случае работает файловый дескриптор. Этот скрипт берет строчки из файла 123 и для каждой из них выполняет отдельно код в конструкции if fi.

Как получается так, что мы уже обращаемся к нему в 3ей строчке кода, но создаем его только в 7ой? Почему он создается именно в строке с «done», а не до цикла while?

#!/bin/bash  
echo start  
while read -ru "$fd_name" line; do  
if [[ -n \"$line\" ]]; then  
echo -n \"$line: \"  
fi  
done {fd_name}<<<"$(cat 123)"  

Нигде не видел чтобы в описании работы while писалось о том, что «done» может как-то с чем-то взаимодействовать



Последнее исправление: xaizek (всего исправлений: 2)
Ответ на: комментарий от KivApple

Спасибо.

Теперь разбираюсь с тем, какую роль играют здесь фигурные скобки у названия файлового дескриптора. Как именно с точки зрения синтаксиса происходит перенаправление ввода в цикл while-done?

Почему не будет работать, к примеру

done <2 cat 123
?

Описание <<< нашёл на

https://www.gnu.org/software/bash/manual/html_node/Redirections.html#Here-Str...

. Оттуда понял, что <<< разбивает результат команды построчно и отправляет его в файловый дескриптор.

Cau84
() автор топика
Ответ на: комментарий от Cau84

Почему не будет работать, к примеру

Оно не запустится просто, по моему. Там 2 command list без разделителя(;|). Почитай мануал к тому же bash’у, там довольно понятно расписано про перенаправления в том числе. Если кратко о том что здесь происходит: while читает из указанного дескриптора, а этот дескриптор предварительно открывается <<<(там пайп должен быть снизу, т. е. реализованно через пайп).

В твоём случае будет работать и вот такое:

while read -r line; do  
if [[ -n \"$line\" ]]; then  
echo -n \"$line: \"  
fi  
done <<<"$(cat 123)"

Потому как input redirection’ы и read работают с stdin, если отдельно им не указать иное. Серьёзно, почитай man(в сети даже перевод где-то был, емнип). Это быстрее, чем все частные случаи на практике исследовать. Прочитал одну конструкцию - опробовал, читаешь следующую…

<<< разбивает результат команды построчно

Это read делает.

anonymous
()
Ответ на: комментарий от anonymous

без разделителя(;|)

без разделителя(;|<newline>).

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.