Как стать автором
Обновить

Комментарии 3

спасибо, никогда не задумывался.
возможно, потому, что вместо


while IFS= read -r host
do
ssh "$host" uptime
done < hostlist.txt

обычно пишу


for host in $(cat hostlist.txt); do
  ssh $host uptime
done

в таком случе файле можно писать несколько хостов в сточку через пробел, минус (ИМХО надуманный) — нельзя использовать имена хостов с пробелом и т. п.

while read может прочитат больше данных чем for host in $(cat hostlist.txt);


Хотя я согласен, тоже не встречался с такой проблемой, просто потому что избегаю ситуаций, где надо учитывать такие тонкости, как размер буффера чтения. Если задачу можно решить бОльшим количеством читаемого кода, то я предпочту этот подход.


Можно извернуться как комментатор ниже и рулить отдельными потоками. Это тоже решит проблему. По мне такое решение всё ещё менее читаемое.

Есть вариант не читать readом из stdin, а обеспечить ему свой отдельный поток ввода, на баше это просто:


while IFS= read -r -u $FDHOSTS host; do
    printf "host=$host\tFDHOSTS=$FDHOSTS\n"
    read #ssh, ffmpeg, etc
done {FDHOSTS}< hostlist.txt
exec {FDHOSTS}>&- #freeing up the descriptor

host=aaaa       FDHOSTS=11
<enter>
host=bbb        FDHOSTS=11
<enter>
host=ccc        FDHOSTS=11
<enter>
host=ddd        FDHOSTS=11
<enter>

Как вариант, можно захардкодить один из "почти всегда свободных дескрипторов", тогда шелл закроет файл сам:


while IFS= read -r -u 3 host; do
    printf "host=$host\n"
    read #ssh, ffmpeg, etc
done 3< hostlist.txt
Зарегистрируйтесь на Хабре, чтобы оставить комментарий