@topuserman

Поясните пожалуйста bash скрипт?

while read FILE_NAME; do
    echo $FILE_NAME;
done < <(ls -1 "./my_temp_dir/")


Подскажите пожалуйста,
что делает эта строчка кода done < <(ls -1 "./my_temp_dir/")

желательно подробно))

мне непонятен синтаксис, а именно, что дает < <,

и почему read FILE_NAME; считывает файлы из директории, которая каким-то образом передается после цикла.

как это вообще работает, просьба описать.
  • Вопрос задан
  • 511 просмотров
Решения вопроса 2
Lynn
@Lynn
nginx, js, css
https://www.opennet.ru/man.shtml?topic=bash&catego...

Это две разных конструкции.
Первый знак < это стандартное перенаправление ввода.

<(...) это Подстановка процессов, т.е. вывод команды в скобках будет как бы файлом.

В данном скрипте это всё видимо сделано исключительно для демонстрации.
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
кода done < <(ls -1 "./my_temp_dir/")

ls -1 выводит содержание каталога в одну строку по одному наименованию
<(blabla) создает из команды поток, который передается как файловый десктриптор
< перенаправление данных из файлового дескриптора в предыдущую команду
done является частью цикла, поэтому перенаправление идет не в done а в весь блок цикла.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@RayHex
1. https://tldp.org/LDP/abs/html/process-sub.html
2. bash это интерпритатор, вы всегда можете вставить куски выражения, и посмотреть что они выдают, например:
echo <(ls -1 .)
/dev/fd/63

3. Ваш код мягко говоря дурно пахнет, а по сути он вообще кривой и будет сбоить на файлах со спецсимволами или даже пробелами. Можно сделать проще и правильнее:
shopt -s nullglob
for f in my_temp_dir/*; do
    echo "$f"
done

nullglob нужен для случаев когда файлов совсем не будет, без него подставится строка со *, и это может вызвать ошибку в вашем коде.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы