Комментарии 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
Буферы и окна: подробности о тайне ssh и цикла чтения while